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.

abeba
quelle

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]);
        } 
    }
}
prodigitalson
quelle
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.

pablo.meier
quelle
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);
    }
}
Luft-Dex
quelle
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]);
        }
    }
}
Josh
quelle
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;
        }
    }
}
Magallane
quelle
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.

Corey Sunwold
quelle
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