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.
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]);
}
}
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.
foreach($display_related_tags as $key => $tag_name)
{
if($tag_name == $found_tag['name'])
unset($display_related_tags[$key];
}
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.
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.
essayez d'utiliser les fonctions next()
, current()
dans while
, for
cycle.
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.
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);