考虑一些数组:
$data = [
"k0"=>"v0",
"k1"=>"v1",
"k2"=>"v2",
"k3"=>"v3",
"k4"=>"v4",
];
遍历数组$ data和print array $ 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之间的数组遍历不同?
答案 0 :(得分:1)
我在PHP :: Bug #77014中提出了一个错误。正确/预期的行为是PHP 7+中存在的行为。我引用了nikic@php.net
的答案:
该行为是预期的。将数组传递给函数不会 更改内部数组指针的位置。我相信PHP 5 行为是key()通过以下方式接受数组的某种人工产物 引用并在那里触发分离。
如果您想确保要从数组中迭代数组 开始而不是从内部数组的先前位置开始 指针,您可以执行显式调用reset()。
(我建议完全远离这些功能,如果它位于 一切可能。如果涉及复杂的迭代模式, ArrayIterator可以替代。)
我猜谜团解决了。