为什么php5和php7之间的数组遍历不同

时间:2017-08-28 20:55:50

标签: php-5.5 php-7.1

考虑一些数组:

$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之间的数组遍历不同?

1 个答案:

答案 0 :(得分:1)

我在PHP :: Bug #77014中提出了一个错误。正确/预期的行为是PHP 7+中存在的行为。我引用了nikic@php.net的答案:

  

该行为是预期的。将数组传递给函数不会   更改内部数组指针的位置。我相信PHP 5   行为是key()通过以下方式接受数组的某种人工产物   引用并在那里触发分离。

     

如果您想确保要从数组中迭代数组   开始而不是从内部数组的先前位置开始   指针,您可以执行显式调用reset()。

     

(我建议完全远离这些功能,如果它位于   一切可能。如果涉及复杂的迭代模式,   ArrayIterator可以替代。)

我猜谜团解决了。