array_search($value, $array) liefert den Schlüssel des ersten Elements, das gleich $value ist, oder false, wenn kein Element passt. Weil ein gefundener Schlüssel 0 sein kann, prüfst du das Ergebnis mit !== false, etwa so: if (($key = array_search('pear', $fruits)) !== false).
Wenn du nur ein Ja oder Nein brauchst, sagt dir in_array() das direkt. array_search() ist für Fälle, in denen du wissen musst, wo der Wert steht, zum Beispiel um ihn zu ändern oder zu entfernen.
Die Falle 0 vs false
Der häufigste array_search()-Bug: Der Wert ist das erste Element, sein Schlüssel ist 0, und if ($key) behandelt 0 als falsch. Der Code sagt „nicht gefunden“ zu einem Wert, der direkt da ist. Vergleiche mit !== false, das nur auf ein echtes false passt.
!= false hat denselben Bug wie if ($key), weil 0 == false gleich true ist. Nur der strikte Operator unterscheidet die beiden.
Strikte Suche
Wie in_array() vergleicht array_search() mit ==, außer du übergibst true als drittes Argument. Im lockeren Modus findet ein String eine Zahl und null findet 0, was einen Schlüssel liefert, mit dem du nicht gerechnet hast.
Alle Schlüssel mit einem Wert finden
array_search() hört beim ersten Treffer auf. array_keys($array, $value) liefert jeden passenden Schlüssel als Array; füge true für einen strikten Vergleich hinzu. Ein leeres Ergebnis bedeutet keinen Treffer, also gibt es keine Verwechslung von 0 und false.
Ein mehrdimensionales Array mit array_column durchsuchen
array_search() schaut nicht in verschachtelte Arrays. Bei einer Liste von Zeilen ziehst du das gesuchte Feld mit array_column() heraus; die Positionen in dieser Liste entsprechen den Zeilennummern, also ist das Ergebnis der Index der Zeile.
array_column() nummeriert seine Ausgabe ab 0 neu, also passt das nur, wenn die Zeilen lückenlos mit 0, 1, 2 nummeriert sind. Nach unset() oder array_filter() hat die Nummerierung Lücken; rufe vorher array_values() auf die Zeilen auf oder verwende den Lookup über Schlüssel in den letzten zwei Zeilen. array_column() zeigt mehr zur Form mit Index-Schlüssel.
Suche ohne Groß- und Kleinschreibung
array_search() vergleicht Strings exakt. Wandle beide Seiten in Kleinbuchstaben um, um die Schreibweise zu ignorieren. array_map() behält die Schlüssel, also ist der zurückgegebene Schlüssel der Schlüssel im ursprünglichen Array.
Suchen und ersetzen oder entfernen
Meist sucht man, um mit dem gefundenen Element etwas zu tun. Mit dem Schlüssel in der Hand weist du etwas zu, um es zu ändern, oder rufst unset() auf, um es zu entfernen, und sicherst immer vorher mit !== false ab: unset($arr[false]) entfernt still das Element mit dem Schlüssel 0.
Häufig gestellte Fragen
Was liefert array_search, wenn der Wert nicht gefunden wird?
false. Wird der Wert gefunden, liefert es seinen Schlüssel, und der kann 0 oder ein leerer String sein, also prüfst du das Ergebnis mit !== false, nie mit if ($key) oder != false.
Warum schlägt meine array_search-Prüfung beim ersten Element fehl?
Das erste Element eines indizierten Arrays hat den Schlüssel 0, und 0 ist falsy. if (array_search('a', ['a', 'b'])) nimmt deshalb den Zweig für „nicht gefunden“. Schreib if (array_search('a', $arr) !== false).
Wie finde ich in PHP alle Schlüssel zu einem Wert?
array_search() hört beim ersten Treffer auf. array_keys($array, $value, true) liefert jeden Schlüssel, dessen Wert passt, als Array (leer, wenn es keinen gibt).
Wie durchsuche ich in PHP ein mehrdimensionales Array?
Zieh das Feld in eine flache Liste und durchsuche diese: $i = array_search('ada@example.com', array_column($users, 'email'));, dann liest du die Zeile als $users[$i]. Das funktioniert, wenn die Zeilen mit 0, 1, 2 nummeriert sind; sonst iterierst du mit foreach.