PHP for not loop for all values

PHP for not loop for all values

我有这个代码片段:

var_dump(count($xml)); // returns 34 

for($i = 8; $i < count($xml); $i++){ 
    echo "unseting $i <br>";
    unset($xml[$i]);
}

var_dump($xml);

结果:

整数 34

取消设置 8 取消设置 9 取消设置 10 取消设置 11 取消设置 12 取消设置 13 取消设置 14 取消设置 15 取消设置 16 取消设置 17 取消设置 18 取消设置 19 取消设置 20

为什么这个 for 在 $i = 20 处中断?

当我为 $i = 0 更改 for 循环时 - 它仍然工作异常。我只得到数字 0-16 - 总是只有一半。但是当我评论 unset line - 然后它遍历所有值..

unset哪里会出问题?为什么 unset 打破我的一半?

当您 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; $++) {
    ...
}

您遇到这种情况是因为 unset() 破坏了指定的变量。

因此,当您遍历循环并同时使用 unset()从数组中删除元素,数组大小也随着从数组中删除元素而减小,

所以执行是这样的,

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

unset 从索引数组中删除元素,使 count() 结果减少,影响 for 循环的结束条件。

如果您打算从某个索引开始删除数组元素,那么您可以只使用 array_splice:

array_splice($xml, 8);