web-dev-qa-db-fra.com

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

J'ai une boucle foreach configurée pour parcourir mon tableau, rechercher un certain lien et, le cas échéant, supprimer ce lien du tableau.

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 cela ne supprime pas le tableau entires. C'est probablement quelque chose à voir avec $images[$image], car ce n'est pas la clé de l'entrée du tableau, seulement le contenu? Y a-t-il un moyen de faire cela sans incorporer de compteur?

Merci.

EDIT: Merci les gars, mais maintenant j'ai un autre problème où les entrées du tableau ne sont pas effacées.

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 actuellement un tableau à deux dimensions, d’où la raison pour laquelle j'ai besoin de $ images [1]. J'ai vérifié et cela contournait avec succès les éléments du tableau, et certains éléments contiennent certaines de ces URL que je souhaite supprimer, mais ils ne 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!

61
Matt
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]);
    }
}
77
hsz

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.

55
selfawaresoup

Pour répondre à la question initiale (après votre modification), vous devez désélectionner ($ images [1] [$ key]);

Maintenant quelques informations supplémentaires sur le fonctionnement de PHP): vous pouvez supprimer en toute sécurité des éléments du tableau dans une boucle foreach, que le fait d'avoir ou non l'élément de tableau n'a pas d'importance. Voir ce code:

$a=[1,2,3,4,5];
foreach($a as $key=>$val)
{
   if ($key==3) unset($a[$key]);
}
print_r($a);

Cela imprime:

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

Comme vous pouvez le constater, si vous ne définissez pas la bonne chose dans la boucle foreach, tout fonctionne correctement.

6
Tomas M

Vous pouvez utiliser l'index de l'élément de tableau pour le supprimer du tableau, la prochaine fois que vous utiliserez le $list variable, vous verrez que le tableau est modifié.

Essayez quelque chose comme ça

foreach($list as $itemIndex => &$item) {

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

}
4
webmaster

$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]).

4
Gumbo

Vous auriez aussi besoin d'un

$i--;

après chaque unset de ne pas sauter un élément /

Parce que quand tu désinstalles $item[45], le prochain élément de la boucle for devrait être $item[45] - ce qui était [46] avant de décrocher. Si vous ne le faites pas, vous sauterez toujours un élément après la réinitialisation.

2
murph.vienna

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.

1
Peter Porfy

Une solution consisterait à utiliser la clé de vos éléments pour les supprimer. Vous pouvez à la fois les clés et les valeurs lors de la boucle avec foreach .

Par exemple :

$arr = array(
    'a' => 123,
    'b' => 456,
    'c' => 789, 
);

foreach ($arr as $key => $item) {
    if ($item == 456) {
        unset($arr[$key]);
    }
}

var_dump($arr);

Vous donnera ce tableau, à la fin:

array
  'a' => int 123
  'c' => int 789


Ce qui signifie que, dans votre cas, une telle chose devrait faire l'affaire:

foreach($images 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]);
    }
}
1
Pascal MARTIN

Désolé pour la réponse tardive, j'ai récemment eu le même problème avec PHP et ai découvert que lorsque vous travaillez avec des tableaux qui n'utilisent pas $key => $value structure, lorsque vous utilisez la boucle foreach, vous copiez la valeur de la position sur la variable de la boucle, dans ce cas $image. Essayez d'utiliser ce code et cela résoudra votre problème.

for ($i=0; $i < count($images[1]); $i++)
{

    if($images[1][$i] == 'http://i27.tinypic.com/29yk345.gif' ||

    $images[1][$i] == 'http://img3.abload.de/img/10nx2340fhco.gif' ||

    $images[1][$i] == 'http://i42.tinypic.com/9pp2456x.gif')

    {

        unset($images[1][$i]);

    }

}

var_dump($images);die();
0
jameslimousin