PHP Element aus Array nach Wert löschen: Hinter den Kulissen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

PHP Array nach Wert löschen (nicht Schlüssel): Ein Blick unter die Haube

\n\n

Stell 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.

\n\n

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?

\n\n

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\n

Der Klassiker: array_search + unset

\n\n

Die 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\n

Dieser Code findet das erste Vorkommen des Werts und entfernt es. Aber schauen wir uns genauer an, was hier eigentlich passiert.

\n\n

Wie array_search funktioniert

\n\n

array_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:

\n\n
<?php\n$array = [0, '0', 1];\n$key = array_search('0', $array, true); // gibt 1 zurück (String '0'), nicht 0\n?>
\n\n

Wird 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.

\n\n

Fallstrick: unset indiziert das Array nicht neu

\n\n

Nach 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():

\n\n
<?php\n$array = ['Apfel', 'Birne', 'Orange'];\nunset($array[1]);\n$array = array_values($array); // ['Apfel', 'Orange'] mit Schlüsseln 0 und 1\n?>
\n\n

Denk aber daran: array_values() erstellt ein neues Array, was den Speicherverbrauch erhöht.

\n\n

Alle Vorkommen entfernen: array_diff

\n\n

Wenn du alle Elemente mit einem bestimmten Wert entfernen musst, ist array_search in einer Schleife nicht die beste Wahl. Viel eleganter funktioniert array_diff():

\n\n
<?php\n$array = ['Apfel', 'Birne', 'Orange', 'Birne'];\n$array = array_diff($array, ['Birne']);\n// Ergebnis: ['Apfel', 'Orange'] (Schlüssel bleiben erhalten)\n?>
\n\n

Die 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\n

Wichtig: array_diff vergleicht die Werte als Strings ((string) $elem1 === (string) $elem2). Bei gemischten Typen kann das zu unerwarteten Ergebnissen führen:

\n\n
<?php\n$array = [0, '0', false];\n$result = array_diff($array, [0]);\n// Ergebnis:                

Blogs

Buchempfehlungen