我设置了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
)
)
谢谢!
答案 0 :(得分:76)
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]);
}
}
答案 1 :(得分:55)
试试:
foreach ($images as $key => &$image) {
if (yourConditionGoesHere) {
unset($images[$key])
}
}
通常情况下,foreach会对您的数组副本进行操作,因此您所做的任何更改都会对该副本进行更改,并且不会影响实际的数组。
所以你需要通过$ images [$ key];
取消设置值& $ image上的引用阻止循环创建一个会浪费内存的数组副本。
答案 2 :(得分:4)
$image
在您的情况下是项目的值而不是密钥。使用以下语法来获取密钥:
foreach ($images as $key => $value) {
/* … */
}
现在,您可以使用unset($images[$key])
删除该项目。
答案 3 :(得分:4)
您可以使用数组元素的索引将其从数组中删除,下次使用$list
变量时,您将看到数组已更改。
尝试这样的事情
foreach($list as $itemIndex => &$item) {
if($item['status'] === false) {
unset($list[itemIndex]);
}
}
答案 4 :(得分:4)
要回答最初的问题(编辑后),您需要取消设置($ 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循环中取消设置正确的东西,一切正常。
答案 5 :(得分:2)
你还需要一个
$i--;
每次取消设置后都不跳过元素/
因为当您取消设置$item[45]
时,for循环中的下一个元素应为$item[45]
- 在取消设置之前为[46]
。如果你不这样做,你总是在取消设置后跳过一个元素。
答案 6 :(得分: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]毫无意义。
答案 7 :(得分: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]);
}
}
答案 8 :(得分: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();