75

我设置了一个 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]);
    }
}

但它不会删除整个数组。这可能与$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]);
    }
}

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

)

谢谢!

4

9 回答 9

91
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]);
    }
}
于 2010-01-05T20:33:31.117 回答
69

试试看:

foreach ($images[1] as $key => &$image) {
    if (yourConditionGoesHere) {
        unset($images[1][$key])
    }
}
unset($image); // detach reference after loop  

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

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

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

于 2010-01-05T20:34:41.053 回答
11

要回答最初的问题(编辑后),您需要 unset($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);

这打印:

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

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

于 2016-02-22T17:19:15.850 回答
6

您可以使用数组元素的索引将其从数组中删除,下次使用该$list变量时,您会看到数组发生了变化。

尝试这样的事情

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

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

}
于 2014-01-03T17:43:44.863 回答
4

$image在你的情况下是项目的价值而不是关键。也可以使用以下语法来获取密钥:

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

现在您可以使用 删除该项目unset($images[$key])

于 2010-01-05T20:34:05.797 回答
1

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 as $key=>$image

因为 $image 是值,所以 $images[$image] 没有意义。

于 2010-01-05T20:34:30.633 回答
1

一种解决方案是使用您的项目的键来删除它们——在使用foreach循环时,您可以同时使用键和值。

例如 :

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

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

var_dump($arr);

最后会给你这个数组:

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


这意味着,在您的情况下,这样的事情应该可以解决问题:

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]);
    }
}
于 2010-01-05T20:34:59.397 回答
1

你还需要一个

$i--;

在每次未设置为不跳过元素之后/

因为当你 unset 时$item[45],for循环中的下一个元素应该是$item[45]- 这是在取消设置[46]之前。如果你不这样做,你总是会在取消设置后跳过一个元素。

于 2012-03-06T22:52:42.280 回答
0

抱歉回复晚了,我最近在使用 PHP 时遇到了同样的问题,发现当使用不使用$key => $value结构的数组时,在使用foreach循环时,您实际复制了循环变量上的位置值,在这种情况下$image。尝试使用此代码,它将解决您的问题。

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();
于 2011-10-26T21:45:59.830 回答