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

这个问题在这里已有答案:

  • 如何在foreach循环中删除数组元素?                                     8个答案

我设置了一个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有关,因为这不是数组条目的键,而是内容? 有没有办法在没有柜台的情况下做到这一点?

谢谢。

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

我的新代码:

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
        )

)

谢谢!

Matt asked 2019-10-08T05:27:20Z
9个解决方案
76 votes
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]);
    }
}
hsz answered 2019-10-08T05:27:24Z
55 votes

试试看:

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

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

因此,您需要通过$ images [$ key];取消设置这些值。

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

selfawaresoup answered 2019-10-08T05:28:05Z
4 votes

unset($images[$key])在您的情况下是项目的值,而不是密钥。 也使用以下语法来获取密钥:

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

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

Gumbo answered 2019-10-08T05:28:35Z
4 votes

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

试试这个

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

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

}
webmaster answered 2019-10-08T05:29:06Z
4 votes

要回答最初的问题(在编辑后),您需要取消设置($ 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循环中未设置正确的内容,则一切正常。

Tomas M answered 2019-10-08T05:29:46Z
2 votes

您还需要一个

$i--;

每次取消设置后不跳过元素/

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

murph.vienna answered 2019-10-08T05:30:26Z
1 votes

一种解决方案是使用项目的键将其删除-在使用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]);
    }
}
Pascal MARTIN answered 2019-10-08T05:31:10Z
1 votes

!! foreach($ images as $ key => $ image

因为$ image是值,所以$ images [$ image]毫无意义。

Peter Porfy answered 2019-10-08T05:31:42Z
0 votes

很抱歉,我的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();
jameslimousin answered 2019-10-08T05:32:10Z
translate from https://stackoverflow.com:/questions/2008866/unsetting-array-values-in-a-foreach-loop