161 votes

Comment supprimer un objet du tableau dans une boucle foreach ?

J'itère à travers un tableau d'objets et je veux supprimer un des objets en fonction de sa propriété 'id', mais mon code ne fonctionne pas.

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
        } 
    }
}

Toutes les suggestions. Merci.

2 votes

267voto

prodigitalson Points 38549
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]);
        } 
    }
}

69 votes

Est-il possible de supprimer un élément d'un tableau dans une boucle foreach du même tableau ?

27 votes

@Oliver : généralement, cela va générer un comportement inattendu, mais vous pouvez le faire en toute sécurité avec foreach sur php. Vous pouvez lire ici un test : php.net/manual/en/control-structures.foreach.php#88578

0 votes

Ceci est la conversion de mon tableau en objet dans CodeIgniter. Une suggestion ?

5voto

magallanes Points 1024

Faites attention à la réponse principale.

con

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

et en appelant la fonction

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

il retourne

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

au lieu de

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

C'est parce que unset ne réindexe pas le tableau.

Il réindexe. (si on en a besoin)

$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;
        }
    }
}

2 votes

Pour réindexer un tableau, vous pouvez utiliser $array = array_values($array);

2voto

paul.meier Points 1103

Il semble que votre syntaxe pour unset est invalide, et l'absence de réindexation pourrait causer des problèmes à l'avenir. Voir : la section sur les tableaux PHP .

La syntaxe correcte est indiquée ci-dessus. Gardez également à l'esprit tableau de valeurs pour la réindexation, de sorte que vous n'indexez jamais quelque chose que vous avez précédemment supprimé.

1voto

Josh Points 399

Cela devrait faire l'affaire.....

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

-1voto

air-dex Points 1806

Vous pouvez également utiliser des références sur foreach valeurs :

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

10 votes

$element (utilisé à l'intérieur et à l'extérieur du foreach) est juste une référence à chaque élément du tableau. unset($element) va juste casser la référence, il ne détruit pas l'élément référencé de son tableau.

3 votes

@Dev_NIX $element = null ne fonctionnerait PAS, la longueur de $array reste la même, elle ne contiendrait que des nuls.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X