Wie lösche ich ein Objekt aus dem Array innerhalb einer foreach-Schleife?


140

Ich iteriere durch ein Array von Objekten und möchte eines der Objekte basierend auf seiner 'id'-Eigenschaft löschen, aber mein Code funktioniert nicht.

foreach($array as $element) {
    foreach($element as $key => $value) {
        if($key == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($element);//this doesn't work
            unset($array,$element);//neither does this
        } 
    }
}

Irgendwelche Vorschläge. Vielen Dank.


Antworten:


232
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        } 
    }
}

62
Ist es sicher, ein Element eines Arrays innerhalb einer foreach-Schleife desselben Arrays zu entfernen?
Olivier Pons

25
@Oliver: Normalerweise wird es unerwartetes Verhalten erzeugen, aber Sie können es sicher mit foreach auf PHP tun. Lesen Sie hier für einen Test: php.net/manual/en/control-structures.foreach.php#88578
pangon

1
@Paritosh Ich weiß, dass Sie dies vor langer Zeit gepostet haben, aber es liegt daran, dass PHP assoziative Arrays verwendet. Sie haben also einen Index, der gelöscht wird: und der als Objekt in JSON codiert wird. Sinnvoll, da ein assoziatives Array ein "Wörterbuch" ist. Könnte jemandem helfen, der mitkommt.
Ryan O'Donnell

1
Müssen Sie wirklich die Sekunde für jeden machen? Können Sie nicht einfach die gewünschte 'id'-Eigenschaft des Objekts abfragen? Warum alle anderen Requisiten überprüfen?
Htafoya

3
@htafoya nein, du könntest es einfach tun, if(isset($element['id']) && $element['id'] == 'searched_value') { unset($array[$elementKey]); }denke ich, als ich gerade seinen Code kopierte und modifizierte, um ihm zu zeigen, wie man es unsetrichtig macht.
prodigitalson

2

Es sieht so aus, als ob Ihre Syntax für unset ungültig ist und das Fehlen einer Neuindizierung in Zukunft Probleme verursachen könnte. Siehe: den Abschnitt über PHP-Arrays .

Die korrekte Syntax ist oben dargestellt. Denken Sie auch an Array-Werte für die Neuindizierung, damit Sie niemals etwas indizieren, das Sie zuvor gelöscht haben.


2

Sie können auch Verweise auf foreachWerte verwenden:

foreach($array as $elementKey => &$element) {
    // $element is the same than &$array[$elementKey]
    if (isset($element['id']) and $element['id'] == 'searched_value') {
        unset($element);
    }
}

9
$ element (wird in und außerhalb von foreach verwendet) ist nur eine Referenz auf jedes Element im Array. unset ($ element) unterbricht nur die Referenz, zerstört das referenzierte Element nicht aus seinem Array.
Nicholas

3
@ Dev_NIX $element = nullwürde NICHT funktionieren, die Länge $arraybleibt gleich, es würde nur Nullen enthalten
Nico Westerdale

1

Dies sollte den Trick tun .....

reset($array);
while (list($elementKey, $element) = each($array)) {
    while (list($key, $value2) = each($element)) {
        if($key == 'id' && $value == 'searched_value') {
            unset($array[$elementKey]);
        }
    }
}

1

Seien Sie vorsichtig mit der Hauptantwort.

mit

[['id'=>1,'cat'=>'vip']
,['id'=>2,'cat'=>'vip']
,['id'=>3,'cat'=>'normal']

und Aufrufen der Funktion

foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'cat' && $value == 'vip'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        } 
    }
}

es kehrt zurück

[2=>['id'=>3,'cat'=>'normal']

anstatt

[0=>['id'=>3,'cat'=>'normal']

Dies liegt daran, dass unset das Array nicht neu indiziert.

Es indiziert neu. (wenn wir es brauchen)

$result=[];
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        $found=false;
        if($valueKey === 'cat' && $value === 'vip'){
            $found=true;
            $break;
        } 
        if(!$found) {
           $result[]=$element;
        }
    }
}

0

Ich bin kein großer PHP-Programmierer, aber ich kann sagen, dass Sie in C # ein Array nicht ändern können, während Sie es durchlaufen. Möglicherweise möchten Sie versuchen, mit Ihrer foreach-Schleife den Index des Elements oder der zu entfernenden Elemente zu identifizieren und die Elemente nach der Schleife zu löschen.


14
Während es in den meisten Sprachen eine schlechte Praxis ist, sind Arrays in PHP im Grunde genommen assoziative Arrays, die der Reihe nach iteriert werden können. Durch das Löschen eines früheren Elements werden die Schlüssel der nachfolgenden Elemente nicht geändert.
Ignacio Vazquez-Abrams

22
Tatsächlich ist dies zulässig, da das von foreach intern verwendete Array eine Kopie des ursprünglichen Arrays ist. Auf diese Weise ist das Ändern des ursprünglichen Arrays absolut sicher.
Juan

68
Eigentlich ist es erlaubt, weil PHP verdammt verrückt ist.
Eric G
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.