Comment supprimer un élément de tableau dans une boucle foreach?

je veux parcourir un tableau avec foreach pour vérifier si une valeur existe. Si la valeur existe, je veux supprimer l'élément qui la contient.

j'ai le code suivant:

foreach($display_related_tags as $tag_name) {
    if($tag_name == $found_tag['name']) {
        // Delete element
    }
}

Je ne sais pas comment supprimer l'élément une fois que la valeur est trouvée. Comment puis-je le supprimer?

je dois utiliser foreach pour ce problème. Il y a probablement des alternatives à foreach , et vous êtes invités à partager ils.

91
demandé sur Kevin 2009-12-23 00:22:44

8 réponses

si vous obtenez aussi la clé, vous pouvez supprimer cet article comme ceci:

foreach ($display_related_tags as $key => $tag_name) {
    if($tag_name == $found_tag['name']) {
        unset($display_related_tags[$key]);
    }
}
174
répondu Gumbo 2009-12-22 21:25:09

une meilleure solution est d'utiliser la fonction array_filter :

$display_related_tags =
    array_filter($display_related_tags, function($e) use($found_tag){
        return $e != $found_tag['name'];
    });

Comme le php documentation lit:

comme foreach s'appuie sur le pointeur de tableau interne en PHP 5, Le changer dans la boucle peut conduire à un comportement inattendu.

en PHP 7, foreach n'utilise pas le pointeur de tableau interne.

21
répondu Neils 2018-09-18 08:49:22
foreach($display_related_tags as $key => $tag_name)
{
    if($tag_name == $found_tag['name'])
        unset($display_related_tags[$key];
}
9
répondu Steve H 2010-02-08 15:50:29

au Lieu de faire foreach() en boucle sur le tableau, il serait plus rapide d'utiliser array_search() pour trouver la bonne clé. Sur les petits tableaux, j'irais avec foreach pour une meilleure lisibilité, mais pour les tableaux plus grands, ou le code souvent exécuté, cela devrait être un peu plus optimal:

$result=array_search($unwantedValue,$array,true);
if($result !== false) {
  unset($array[$result]);   
}

l'opérateur de comparsion strict != = est nécessaire, car array_search() peut retourner 0 comme l'index de la valeur $unwanteded.

aussi, l'exemple ci-dessus supprimera juste la première valeur $unwantedValue, si $unwantedValue peut apparaître plus d'une fois dans le tableau$, vous devriez utiliser array_keys (), pour tous les trouver:

$result=array_keys($array,$unwantedValue,true)
foreach($result as $key) {
  unset($array[$key]);
}

Vérifier http://php.net/manual/en/function.array-search.php pour plus d'informations.

5
répondu PiotrN 2009-12-22 22:17:11

comme cela a déjà été mentionné, vous voudriez faire un foreach avec la clé, et désactiver l'utilisation de la clé – mais notez que la mutation d'un tableau pendant l'itération est en général une mauvaise idée, bien que je ne suis pas sûr sur les règles de PHP sur ce offhand.

0
répondu Ciarán Walsh 2009-12-22 21:26:47

essayez d'utiliser les fonctions next() , current() dans while , for cycle.

0
répondu pliashkou 2015-08-11 13:49:30

si vous avez scénario dans lequel vous devez supprimer plus d'une des valeurs du tableau foreach dans ce cas, vous devez passer de la valeur, par référence pour chacun: J'essaie d'expliquer ce scénario:

foreach ($manSkuQty as $man_sku => &$man_qty) {

               foreach ($manufacturerSkus as $key1 => $val1) {

  // some processing here and unset first loops entries                     
 //  here dont include again for next iterations
                           if(some condition)
                            unset($manSkuQty[$key1]);

                        }
               }
}

dans la deuxième boucle, vous voulez désactiver les premières boucles entrées ne viennent pas à nouveau dans l'itération à des fins de performance ou alors désactiver de la mémoire aussi bien parce que dans la mémoire ils présentent et viendront dans les itérations.

0
répondu Hassan Ali Shahzad 2015-12-10 21:36:05

il y a déjà des réponses qui donnent de la lumière sur la façon de désactiver. Plutôt que de répéter le code dans toutes vos classes faites fonction comme ci-dessous et utilisez-le dans le code chaque fois que nécessaire. Dans la logique des affaires, parfois vous ne voulez pas exposer certaines propriétés. Veuillez voir ci-dessous un liner appel à supprimer

public static function removeKeysFromAssociativeArray($associativeArray, $keysToUnset)
{
    if (empty($associativeArray) || empty($keysToUnset))
        return array();

    foreach ($associativeArray as $key => $arr) {
        if (!is_array($arr)) {
            continue;
        }

        foreach ($keysToUnset as $keyToUnset) {
            if (array_key_exists($keyToUnset, $arr)) {
                unset($arr[$keyToUnset]);
            }
        }
        $associativeArray[$key] = $arr;
    }
    return $associativeArray;
}

Appel comme:

removeKeysFromAssociativeArray($arrValues, $keysToRemove);
0
répondu Somnath Muluk 2017-12-26 12:57:23