在foreach循环中取消设置数组值
我有一个foreach循环设置通过我的数组,检查某个链接,如果它发现它从数组中删除该链接。
我的代码:
foreach($images as $image) { if($image == '160wpb4.gif' || $image == 'http://img3.abload.de/img/10nx2340fhco.gif' || $image == '160wpb4.gif') { unset($images[$image]); } }
但是它不会删除数组。 这可能与$images[$image]
,因为这不是数组input的关键,只是内容? 有没有办法做到这一点,没有纳入柜台?
谢谢。
编辑:谢谢你们,但现在我有另一个问题,其中数组条目实际上并没有被删除。
我的新代码:
foreach($images[1] as $key => $image) { if($image == '160wpb4.gif') $image == 'http://img3.abload.de/img/10nx2340fhco.gif' || $image == '160wpb4.gif') { unset($images[$key]); } }
$图像现在是一个二维数组,因此我需要$ images [1]。 我已经检查,它成功地绕过了数组元素,一些元素实际上有一些我想要删除的URL,但是它们并没有被删除。 这是我的$images
数组:
Array ( [0] => Array ( [0] => useless [1] => useless [2] => useless [3] => useless [4] => useless ) [1] => Array ( [0] => 160wpb4.gif [1] => http://img3.abload.de/img/10nx2340fhco.gif [2] => http://img3.abload.de/img/10nx2340fhco.gif [3] => 160wpb4.gif ) )
谢谢!
foreach($images as $key => $image) { if(in_array($image, array( '160wpb4.gif', 'http://img3.abload.de/img/10nxjl0fhco.gif', '160wpb4.gif', )) { unset($images[$key]); } }
尝试一下:
foreach ($images as $key => &$image) { if (yourConditionGoesHere) { unset($images[$key]) } }
通常情况下,foreach在你的数组副本上进行操作,所以你所做的任何修改都是针对该副本进行的,并不影响实际的数组。
所以你需要通过$ images [$ key]取消设置值。
&$ image上的引用可以防止循环创build数组的副本,浪费内存。
$image
在你的情况下,该项目的价值,而不是关键。 使用以下语法也可以获得密钥:
foreach ($images as $key => $value) { /* … */ }
现在您可以删除未unset($images[$key])
的项目unset($images[$key])
。
您可以使用数组元素的索引将其从数组中删除,下次使用$list
variables时,您将看到该数组已被更改。
尝试这样的事情
foreach($list as $itemIndex => &$item) { if($item['status'] === false) { unset($list[itemIndex]); } }
要回答最初的问题(编辑后),您需要取消设置($ images [1] [$ key]);
现在介绍一下PHP的工作原理:可以在foreach循环中安全地取消设置数组的元素,不pipe数组是否与数组项无关。 看到这个代码:
$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循环中取消正确的事情,一切正常。
你也需要一个
$i--;
在每个未设置之后不跳过元素/
因为当你取消设置$item[45]
,for循环中的下一个元素应该是$item[45]
– 在取消设置之前是[46]
。 如果你不这样做,你总是跳过一个元素后,不设置。
一种解决scheme是使用你的项目的钥匙去除它们 – 当使用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 == '160wpb4.gif' || $image == 'http://img3.abload.de/img/10nx2340fhco.gif' || $image == '160wpb4.gif') { unset($images[$key]); } }
foreach($images as $key=>$image) { if($image == '160wpb4.gif' || $image == 'http://img3.abload.de/img/10nxjl0fhco.gif' || $image == '160wpb4.gif') { unset($images[$key]); } }
foreach($images as $key=>$image) { if($image == '160wpb4.gif' || $image == 'http://img3.abload.de/img/10nxjl0fhco.gif' || $image == '160wpb4.gif') { unset($images[$key]); } }
foreach($图像为$ key => $ image
因为$ image是值,所以$ images [$ image]没有任何意义。
对不起,迟到的回应,我最近有与PHP相同的问题,并发现在使用不使用$key => $value
结构的数组时,使用foreach
循环时,实际上复制循环中位置的值variables,在这种情况下$image
。 尝试使用这个代码,它会解决你的问题。
for ($i=0; $i < count($images[1]); $i++) { if($images[1][$i] == '160wpb4.gif' || $images[1][$i] == 'http://img3.abload.de/img/10nx2340fhco.gif' || $images[1][$i] == '160wpb4.gif') { unset($images[1][$i]); } } var_dump($images);die();