【问题标题】:Variable assignment resets internal array pointer变量赋值重置内部数组指针
【发布时间】:2016-02-06 23:36:41
【问题描述】:

我有这个 PHP 代码:

$a=array(1, 2, 3);
var_dump(current($a));
each($a);
each($a);
each($a);
var_dump(current($a));
$b=$a;
var_dump(current($a));

输出是“int(1) bool(false) int(1)”,但我希望是“int(1) bool(false) bool(false)”,因为经过三次each@的内部指针987654323@ 应该在数组的末尾并留在那里。

但显然赋值$b=$a$a 的指针再次设置回第一个元素。这是怎么回事?

(如果我删除一个each,输出如预期的那样是“int(1) int(3) int(3)”。)

【问题讨论】:

  • 你的问题有点不清楚。抱歉,我可能做不到,但你还能把你的预期结果用更好的方式表达吗?

标签: php arrays


【解决方案1】:

来自http://php.net/manual/en/function.each.php

注意:因为将数组分配给另一个变量会重置原始 数组的指针,如果我们上面的示例将导致无限循环 将 $fruit 分配给循环内的另一个变量。

【讨论】:

  • 如果每个只有两个而不是三个,为什么赋值不重置指针?
  • 这是一个很好的问题,我想答案就在问题中:) 我猜它只有在结束时才会重置。向 php 打开一个错误报告,以便他们在文档中对其进行修复...
  • 在 PHP7 中,根据sandbox.onlinephpfunctions.com,这符合您的预期(返回1, false, false)......在5.6 中,它似乎没有......
  • 对...听起来这是某种副作用,已在 PHP 7 中得到修复。谢谢你们。
  • 好吧“修复”可能取决于观点,我会说“改变了未记录的行为”,这当然会在升级 php 时破坏一些工作代码:)
【解决方案2】:

这是设计使然。这个PHP manual page 声明:

注意因为将数组分配给另一个变量会重置原始数组的指针,如果我们将 $fruit 分配给循环内的另一个变量,上面的示例将导致无限循环。

【讨论】:

    【解决方案3】:

    此行为在 PHP 7 中已得到纠正。

    $a=array(1, 2, 3);
    var_dump(current($a)); // 1
    each($a);
    each($a);
    each($a);
    var_dump(current($a)); // false
    $b=$a;
    var_dump(current($a)); // php7-> false; php5.6 -> 1 
    

    php wiki 页面上描述的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多