web-dev-qa-db-fra.com

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 souhaite 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 résoudre ce problème. Il existe probablement des alternatives à foreach, et vous pouvez les partager.

111
ajsie

Si vous obtenez également la clé, vous pouvez supprimer cet élément comme suit:

foreach ($display_related_tags as $key => $tag_name) {
    if($tag_name == $found_tag['name']) {
        unset($display_related_tags[$key]);
    }
}
192
Gumbo

Une meilleure solution consiste à utiliser le array_filter fonction:

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

Comme le php documentation se lit comme suit:

Comme foreach repose sur le pointeur de tableau interne dans PHP 5, le modifier dans la boucle peut entraîner un comportement inattendu.

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

30
Neils
foreach($display_related_tags as $key => $tag_name)
{
    if($tag_name == $found_tag['name'])
        unset($display_related_tags[$key];
}
9
Steve H

Au lieu de faire une boucle foreach () sur le tableau, il serait plus rapide d’utiliser array_search () pour trouver la clé appropriée. Sur les petits tableaux, je préférerais foreach pour une meilleure lisibilité, mais pour des tableaux plus grands, ou du 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 comparaison strict! == est nécessaire, car array_search () peut renvoyer 0 en tant qu'index de la valeur $ unwantedValue.

En outre, l'exemple ci-dessus supprimera uniquement la première valeur $ unwantedValue. Si la valeur $ unwantedValue peut se produire plusieurs fois dans le tableau $, vous devez utiliser array_keys () pour les rechercher toutes:

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

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

6
PiotrN

si vous avez un scénario dans lequel vous devez supprimer plus d'une valeur du tableau foreach, vous devez dans ce cas transmettre valeur par référence: 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 seconde boucle, vous voulez annuler les premières boucles, les entrées ne reviennent pas dans l'itération à des fins de performance, sinon elles sont également supprimées de la mémoire car elles présentent et viendront en itérations.

0
Hassan Ali Shahzad

Comme cela a déjà été mentionné, vous voudriez faire un foreach avec la clé, et désinstaller en utilisant 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 sois pas sûr des règles de PHP à ce sujet. de façon désinvolte.

0
Ciarán Walsh

Essayez d’utiliser les fonctions next(), current() dans le cycle while, for.

0
pliashkou

Il y a déjà des réponses qui donnent des éclaircissements sur la façon de désactiver. Plutôt que de répéter le code dans toutes vos classes, faites fonctionner comme ci-dessous et utilisez-le dans le code si nécessaire. Dans la logique métier, vous ne voulez parfois pas exposer certaines propriétés. Veuillez voir ci-dessous un appel téléphonique pour 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;
}

Appelez comme:

removeKeysFromAssociativeArray($arrValues, $keysToRemove);
0
Somnath Muluk