77 votes

Annuler la définition des valeurs d'un tableau dans une boucle foreach

J'ai une boucle foreach mis en place pour aller dans ma table, vérifier pour un certain lien, et s'il trouve qu'il supprime ce lien à partir de la matrice.

Mon code:

foreach($images as $image)
{
    if($image == 'http://i27.tinypic.com/29yk345.gif' ||
    $image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
    $image == 'http://i42.tinypic.com/9pp2456x.gif')
    {
        unset($images[$image]);
    }
}

Mais elle ne supprime pas le tableau d'entrées. C'est probablement quelque chose à voir avec $images[$image], comme ce n'est pas la clé de l'entrée de ce tableau, seul le contenu? Est-il un moyen de le faire sans incorporant un compteur?

Merci.

EDIT: Merci les gars, mais maintenant j'ai un autre problème où le tableau des entrées ne sont pas réellement supprimés.

Mon nouveau code:

foreach($images[1] as $key => $image)
{
    if($image == 'http://i27.tinypic.com/29yk345.gif')
    $image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
    $image == 'http://i42.tinypic.com/9pp2456x.gif')
    {
        unset($images[$key]);
    }
}

$images est actuallty un tableau à deux dimensions de maintenant donc pourquoi j'ai besoin de $images[1]. J'ai vérifié et il a réussi à se passe autour d'éléments du tableau, et certains éléments n'ont en réalité certains de ces Url dans que je souhaite supprimer, mais ils sont pas supprimés. C'est mon $images tableau:

Array
(
    [0] => Array
        (
            [0] => useless
            [1] => useless
            [2] => useless
            [3] => useless
            [4] => useless
        )

    [1] => Array
        (
            [0] => http://i27.tinypic.com/29yk345.gif
            [1] => http://img3.abload.de/img/10nx2340fhco.gif
            [2] => http://img3.abload.de/img/10nx2340fhco.gif
            [3] => http://i42.tinypic.com/9pp2456x.gif
        )

)

Merci!

93voto

hsz Points 46509
foreach($images as $key => $image)
{
    if(in_array($image, array(
       'http://i27.tinypic.com/29ykt1f.gif',
       'http://img3.abload.de/img/10nxjl0fhco.gif',
       'http://i42.tinypic.com/9pp2tx.gif',
    ))
    {
        unset($images[$key]);
    }
}

76voto

lnwdr Points 5557

Essayez ça:

 foreach ($images as $key => &$image) {
    if (yourConditionGoesHere) {
        unset($images[$key])
    }
}
 

Normalement, foreach utilise une copie de votre tableau pour que les modifications que vous apportez y soient apportées et n’affectent pas le tableau.

Vous devez donc supprimer les valeurs via $ images [$ key];

La référence sur & $ image empêche la boucle de créer une copie du tableau qui gaspillerait de la mémoire.

7voto

webmaster Points 63

Vous pouvez utiliser une référence pour la supprimer du tableau. La prochaine fois que vous utiliserez la variable $list , vous verrez que le tableau est modifié.

Essayez quelque chose comme ça

 foreach($list as &$item) {

   if($item['status'] == false) {
      unset($item);
   }

}
 

4voto

Gumbo Points 279147

$image est dans votre cas la valeur de l'élément et non la clé. Utilisez également la syntaxe suivante pour obtenir la clé:

 foreach ($images as $key => $value) {
    /* … */
}
 

Vous pouvez maintenant supprimer l'élément avec unset($images[$key]) .

1voto

Peter Porfy Points 4351

foreach($images as $key=>$image)                                
{               
   if($image == 'http://i27.tinypic.com/29ykt1f.gif' ||    
   $image == 'http://img3.abload.de/img/10nxjl0fhco.gif' ||    
   $image == 'http://i42.tinypic.com/9pp2tx.gif')     
   { unset($images[$key]); }                               
} 

!! foreach ($ images en tant que $ key => $ image

cause $ image est la valeur, donc $ images [$ image] n'a aucun sens.

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