PHP Array nach Wert löschen (nicht Schlüssel): Ein Blick unter die Haube
\n\nStell dir vor: Du schreibst ein PHP-Skript, verarbeitest eine Produktliste und musst plötzlich einen Eintrag mit einem bestimmten Preis oder Namen aus dem Array entfernen. Du kennst den Wert genau – zum Beispiel "Apfel" – aber hast keine Ahnung, an welchem Index er liegt. Kommt dir bekannt vor? Wenn ja, bist du nicht allein: Die Frage "PHP Array nach Wert löschen (nicht Schlüssel)" sammelt tausende Aufrufe auf Stack Overflow. Und das aus gutem Grund.
PHP hat keine eingebaute Funktion array_remove_by_value(). Deshalb behelfen sich Entwickler: Die einen schreiben eine Schleife, andere nutzen array_search in Kombination mit unset, wieder andere verwenden array_diff oder array_filter. Aber was passiert dabei intern? Welche Methode ist schneller? Und warum kann derselbe Code in verschiedenen PHP-Versionen unterschiedlich funktionieren?
In diesem Artikel geben wir dir nicht nur eine fertige Lösung – wir blicken hinter die Kulissen jedes Ansatzes, analysieren seine Performance und zeigen dir die Fallstricke. Außerdem präsentieren wir einen echten Anwendungsfall aus dem Backend-Alltag. Los geht's!
\n\nDer Klassiker: array_search + unset
\n\nDie beliebteste Antwort auf Stack Overflow sieht so aus:
\n\n<?php\n$array = ['Apfel', 'Birne', 'Orange', 'Birne'];\n$value = 'Birne';\n\nif (($key = array_search($value, $array)) !== false) {\n unset($array[$key]);\n}\n?>\n\nDieser Code findet das erste Vorkommen des Werts und entfernt es. Aber schauen wir uns genauer an, was hier eigentlich passiert.
\n\nWie array_search funktioniert
\n\narray_search() ist eine lineare Suche. PHP durchläuft das Array von Anfang bis Ende und vergleicht jeden Wert mit dem gesuchten. Der Standardvergleich ist nicht streng (==), das heißt 1 und '1' gelten als gleich. Wenn du einen strengen Vergleich (===) benötigst, übergib den dritten Parameter true:
<?php\n$array = [0, '0', 1];\n$key = array_search('0', $array, true); // gibt 1 zurück (String '0'), nicht 0\n?>\n\nWird der Wert nicht gefunden, gibt die Funktion false zurück. Deshalb ist die Prüfung !== false zwingend erforderlich – sonst entfernt unset($array[0]) das erste Element, falls der Wert den Schlüssel 0 hat.
Fallstrick: unset indiziert das Array nicht neu
\n\nNach unset bleibt das Array assoziativ – die numerischen Schlüssel werden nicht verschoben. Wenn du ein dichtes Array mit fortlaufenden Indizes benötigst, verwende array_values():
<?php\n$array = ['Apfel', 'Birne', 'Orange'];\nunset($array[1]);\n$array = array_values($array); // ['Apfel', 'Orange'] mit Schlüsseln 0 und 1\n?>\n\nDenk aber daran: array_values() erstellt ein neues Array, was den Speicherverbrauch erhöht.
Alle Vorkommen entfernen: array_diff
\n\nWenn du alle Elemente mit einem bestimmten Wert entfernen musst, ist array_search in einer Schleife nicht die beste Wahl. Viel eleganter funktioniert array_diff():
<?php\n$array = ['Apfel', 'Birne', 'Orange', 'Birne'];\n$array = array_diff($array, ['Birne']);\n// Ergebnis: ['Apfel', 'Orange'] (Schlüssel bleiben erhalten)\n?>\n\nDie Funktion gibt ein neues Array zurück, aus dem alle Elemente entfernt wurden, die mit den Werten des zweiten Arrays übereinstimmen. Intern verwendet PHP eine Hash-Tabelle für das zweite Array, daher läuft die Operation in O(n + m), wobei n die Größe des ersten und m die Größe des zweiten Arrays ist.
\n\nWichtig: array_diff vergleicht die Werte als Strings ((string) $elem1 === (string) $elem2). Bei gemischten Typen kann das zu unerwarteten Ergebnissen führen:
<?php\n$array = [0, '0', false];\n$result = array_diff($array, [0]);\n// Ergebnis: