【问题标题】:Why does array traversal differ between php5 and php7为什么php5和php7的数组遍历不同
【发布时间】:2017-08-28 20:55:49
【问题描述】:

考虑一些数组:

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

【问题讨论】:

  • php.net/manual/en/migration54.new-features.php $var = []; php5 的初始版本中没有引入语法。
  • 一行$result_2[key($arr)] = current($data);,我想你的意思是$result_2[key($arr)] = current($arr);,对吧?
  • @mishamosher - 你是对的,当然,更新了代码
  • @vess 您对为每个 PHP 版本产生相同输出的替代代码更感兴趣,或者对为什么会发生这种情况的技术解释更感兴趣?后一个我还是想不通。
  • @mishamosher - 谢谢。我的代码是在 php-5.6(旧 WAMP)上开发的,但由于某种原因,我不得不在生产服务器上迁移到 php-7。在我发现这个问题之前它不会正常运行。当然,更改了代码,现在它运行正常。所以我的问题是 academic - 在文档中没有找到任何解释......也许其他人不会浪费几个小时来调试?

标签: php-5.5 php-7.1


【解决方案1】:

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

该行为是有意的。将数组传递给函数不会 改变内部数组指针的位置。我相信 PHP 5 行为是 key() 接受数组的某种工件 在那里引用并触发分离。

如果您想确保从 开始而不是从内部数组的前一个位置开始 指针,你可以显式调用reset()。

(我建议完全放弃这些功能,如果它在 一切皆有可能。如果涉及复杂的迭代模式, ArrayIterator 可能是一个替代方案。)

我猜谜团解开了。

【讨论】:

    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多