W3docs

strcmp()

Die Funktion strcmp() in PHP vergleicht zwei Strings byteweise (binärsicher) und gibt einen Integer zurück, der ihre relative Reihenfolge anzeigt.

Einführung

strcmp() ist PHPs eingebaute Funktion zum Vergleich zweier Strings Byte für Byte (binärsicherer Vergleich). Anstatt mit einem booleschen Wert nur zu antworten „sind diese gleich?", gibt sie einen Integer zurück, der auch die relative Reihenfolge angibt – genau das, was Sortieralgorithmen benötigen. Diese Seite behandelt die Syntax, die Bedeutung des Rückgabewerts, häufige Fallstricke und wann stattdessen eine verwandte Funktion sinnvoller ist.

Syntax

strcmp(string $string1, string $string2): int

Die Funktion nimmt zwei Strings entgegen und gibt einen int zurück:

RückgabewertBedeutung
0Die beiden Strings sind exakt gleich.
< 0 (negativ)$string1 kommt vor $string2.
> 0 (positiv)$string1 kommt nach $string2.

Nur das Vorzeichen ist garantiert. Der Betrag des Ergebnisses ist ein Implementierungsdetail (oft, aber nicht immer, die ASCII-Differenz des ersten nicht übereinstimmenden Bytes), daher sollte man immer das Vorzeichen prüfen – niemals gegen eine bestimmte Zahl wie == -1 oder == 1 vergleichen.

Der Vergleich ist Groß-/Kleinschreibung-sensitiv und basiert auf Bytewerten. Da Großbuchstaben im ASCII-Zeichensatz (AZ, 65–90) vor Kleinbuchstaben (az, 97–122) kommen, gilt "Z" als „kleiner" als "a".

Grundlegendes Beispiel

php— editable, runs on the server

"Hello" und "World" unterscheiden sich bereits beim ersten Zeichen: H (72) gegenüber W (87). Da H zuerst kommt, gibt strcmp() eine negative Zahl zurück und der zweite Zweig wird ausgeführt, der The first string is less than the second string ausgibt.

Wie der Rückgabewert bestimmt wird

strcmp() durchläuft beide Strings Byte für Byte und hält an der ersten Position, an der sie sich unterscheiden, an und gibt das Vorzeichen dieser Bytedifferenz zurück. Wenn ein String ein Präfix des anderen ist, gilt der kürzere String als „kleiner" als der längere.

<?php

var_dump(strcmp("apple", "apple"));  // int(0)        — identical
var_dump(strcmp("apple", "apples")); // negative int  — "apple" is shorter (a prefix)
var_dump(strcmp("apple", "Apple"));  // positive int  — 'a'(97) > 'A'(65)
var_dump(strcmp("abc", "abd"));      // negative int  — differ at 3rd char: 'c' < 'd'

Der dritte Fall ist der klassische Fallstrick: "apple" und "Apple" sind nicht gleich, da der Vergleich Groß-/Kleinschreibung-sensitiv ist.

Ein häufiger Fehler: Vergleich auf Gleichheit

strcmp() gibt 0 zurück, wenn Strings übereinstimmen, und 0 ist in PHP falsy. Daher ist diese Bedingung falsch herum:

<?php

$a = "secret";
$b = "secret";

// WRONG: this block runs only when the strings are DIFFERENT
if (strcmp($a, $b)) {
    echo "match";       // never printed for equal strings
}

// RIGHT: test explicitly against 0
if (strcmp($a, $b) === 0) {
    echo "match";       // prints "match"
}

Wenn man nur wissen möchte, ob zwei Strings gleich sind (nicht ihre Reihenfolge), ist der einfache ===-Operator klarer und schneller: $a === $b.

Sortieren mit strcmp()

Die eigentliche Stärke von strcmp() liegt in seiner Verwendung als Komparator. usort() erwartet einen Callback, der einen negativen, null oder positiven Wert zurückgibt – genau das, was strcmp() liefert:

<?php

$fruits = ["banana", "Apple", "cherry", "apple"];
usort($fruits, "strcmp");
print_r($fruits);
// Array ( [0] => Apple [1] => apple [2] => banana [3] => cherry )

Großgeschriebenes "Apple" kommt zuerst, weil A (65) vor allen Kleinbuchstaben sortiert wird. Für eine menschenfreundliche, Groß-/Kleinschreibung-unabhängige Sortierung sollte stattdessen strcasecmp() verwendet werden.

Verwandte Funktionen

  • strcasecmp() — wie strcmp(), aber ohne Berücksichtigung der Groß-/Kleinschreibung.
  • strncmp() — vergleicht nur die ersten n Bytes jedes Strings.
  • strcoll() — gebietsschemabewusster Vergleich (berücksichtigt die Sortierregeln des aktuellen Gebietsschemas).
  • substr_compare() — vergleicht Strings ab einem bestimmten Offset.
  • strpos() — findet die Position eines Teilstrings anstatt ganze Strings zu vergleichen.

Zusammenfassung

strcmp() führt einen binärsicheren, Groß-/Kleinschreibung-sensitiven Vergleich zweier Strings durch und gibt 0 zurück, wenn sie gleich sind, eine negative Zahl, wenn der erste früher sortiert, und eine positive Zahl, wenn er später sortiert. Es sollte immer das Vorzeichen des Ergebnisses geprüft werden (nicht ein Literalwert wie -1), und da 0 falsy ist, erfordert der Gleichheitstest ein explizites === 0. Für Groß-/Kleinschreibung-unabhängige, teilweise oder gebietsschemabewusste Vergleiche sollte auf strcasecmp(), strncmp() oder strcoll() zurückgegriffen werden.

Übung

Übung
Was macht die Funktion strcmp() in PHP?
Was macht die Funktion strcmp() in PHP?
Was this page helpful?