PHP for not循环所有值

时间:2016-07-02 06:04:34

标签: php for-loop unset

我有这段代码:

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号 - 只是一半。但是当我评论未设置的行时 - 它会迭代所有的值..

在哪里可以解决问题?为什么不打破我的一半?

3 个答案:

答案 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 

演示:https://eval.in/599426

答案 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);