我有这段代码:
var_dump(count($xml)); // returns 34
for($i = 8; $i < count($xml); $i++){
echo "unseting $i <br>";
unset($xml[$i]);
}
var_dump($xml);
int 34
取消预示8 不知不觉9 不知不觉10 不知不觉11 不知不觉12 不知不觉13 不知不觉14 不知不觉15 不知不觉16 不知不觉17 不知不觉18 不知不觉19 不知不觉20
为什么在$ i = 20时打破这个?
当我为$ i = 0更改for循环时 - 它仍然可以正常工作。我只获得0-16号 - 只是一半。但是当我评论未设置的行时 - 它会迭代所有的值..
在哪里可以解决问题?为什么不打破我的一半?
答案 0 :(得分:3)
你遇到这种情况是因为unset()会破坏指定的变量。
所以当你迭代循环并同时使用 unset()时/ strong>要从数组中删除元素,数组大小也会随着从数组中删除元素而减少
所以执行是这样的,
unseting 8 with remaining array size: 34
unseting 9 with remaining array size: 33
unseting 10 with remaining array size: 32
unseting 11 with remaining array size: 31
unseting 12 with remaining array size: 30
unseting 13 with remaining array size: 29
unseting 14 with remaining array size: 28
unseting 15 with remaining array size: 27
unseting 16 with remaining array size: 26
unseting 17 with remaining array size: 25
unseting 18 with remaining array size: 24
unseting 19 with remaining array size: 23
unseting 20 with remaining array size: 22
答案 1 :(得分:1)
当你unset
移动数组中的项目时,随着循环的运行,数组正在缩小。索引$i
有什么用处,现在基本上是索引$i - 1
。
尝试向后运行循环,然后使用$i--
。
for($i = count($xml); $i > 7; $i--){
echo "unseting $i <br>";
unset($xml[$i]);
}
你也可以在循环运行之前设置长度,这样它就不会像这样在循环中改变:
$count = count($xml);
for ($i = 8; $i < $count; $++) {
...
}
答案 2 :(得分:0)
unset
从索引数组中删除元素,导致count()
结果减少,从而影响for
循环的最终条件。
如果您的意图是从某个索引开始删除数组元素,那么您可以使用array_splice
:
array_splice($xml, 8);