考虑一些数组:
$data = [
"k0"=>"v0",
"k1"=>"v1",
"k2"=>"v2",
"k3"=>"v3",
"k4"=>"v4",
];遍历数组$data和打印数组$result_1
$result_1 = [];
while (key($data)) {
$result_1[key($data)] = current($data);
next($data);
}
print_r($result_1);
//Then perform the same operation in a function supplying the same array $data as argument
//(mind that the internal pointer of $data is at the end):
traverse($data);
function traverse($arr){
$result_2 = [];
while (key($arr)) {
$result_2[key($arr)] = current($arr);
next($arr);
}
print_r($result_2);
}如果在php-5.5上运行上述代码,$result_1和$result_2是相同的:
//Array ( [k0] => v0 [k1] => v1 [k2] => v2 [k3] => v3 [k4] => v4 ) 如果在php-7.1上运行,$result_1与上面的相同,但$result_2是空的:
//Array ( )为什么php-5.5和php-7.1之间的数组遍历不同?
发布于 2019-07-12 16:04:44
我在PHP ::Bug #77014中注册了一个bug。正确/有意的行为是PHP中的一种行为。我引用了nikic@php.net的回答
这种行为是有意的。将数组传递给函数不会改变内部数组指针的位置。我相信PHP 5的行为是某种类型的key()的工件,它通过引用接受数组并在那里触发分离。 如果希望确保从一开始就迭代数组,而不是从内部数组指针的前一个位置迭代数组,则可以执行一个显式调用来重置()。 (如果可能的话,我建议完全离开这些功能。如果涉及复杂的迭代模式,ArrayIterator可能是另一种选择。)
谜团解开了我想。
https://stackoverflow.com/questions/45927238
复制相似问题