在foreach循环中取消设置数组值

Mat*_*att 63 php arrays foreach unset

我有一个foreach循环设置通过我的数组,检查某个链接,如果它发现它从数组中删除该链接.

我的代码:

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

但它并没有删除数组.它可能与某些事情有关$images[$image],因为这不是数组输入的关键,只有内容?有没有办法在不加入计数器的情况下做到这一点?

谢谢.

编辑:谢谢大家,但现在我有另一个问题,其中数组条目实际上没有被删除.

我的新代码:

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

$ images现在是一个二维数组,因此我需要$ images [1].我已经检查过并且它成功地绕过了数组元素,并且一些元素实际上有一些我希望删除的URL,但它们并没有被删除.这是我的$images阵列:

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
        )

)
Run Code Online (Sandbox Code Playgroud)

谢谢!

hsz*_*hsz 80

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 然后尝试`unset($ images [1] [$ key]);` (6认同)

sel*_*oup 57

试试看:

foreach ($images as $key => &$image) {
    if (yourConditionGoesHere) {
        unset($images[$key])
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,foreach对数组的副本进行操作,因此您所做的任何更改都会对该副本进行更改,并且不会影响实际的数组.

所以你需要通过$ images [$ key]取消设置值;

&$ image上的引用可防止循环创建会浪费内存的数组副本.

  • "&image上的引用可以防止循环创建一个会浪费内存的数组副本." < - 我在找什么:) (10认同)
  • 在循环之后你应该'unset($ image);`. (5认同)
  • @IbrahimShendy 安全,以防您以后重用该变量;如果不是,它将修改数组的最后一个元素 (2认同)

web*_*ter 6

您可以使用数组元素的索引将其从数组中移除,下次使用该$list变量时,您将看到数组已更改。

尝试这样的事情

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

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

}
Run Code Online (Sandbox Code Playgroud)


Tom*_*s M 6

要回答最初的问题(在编辑后),您需要取消设置($ images [1] [$ key]);

现在,更多信息将介绍PHP的工作原理:您可以在foreach循环中安全地取消设置数组的元素,并且对于数组项是否具有&无关紧要。参见以下代码:

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

打印:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [4] => 5
)
Run Code Online (Sandbox Code Playgroud)

如您所见,如果您在foreach循环中未设置正确的内容,则一切正常。