【问题标题】:PHP: array's internal pointer stops one element before last one - weirdPHP:数组的内部指针在最后一个元素之前停止一个元素 - 奇怪
【发布时间】:2013-09-21 05:58:54
【问题描述】:

我有一个简单的多维数组。我修改它 - 即。我向它添加数据 - 在 foreach 循环中,通过引用访问其元素:

 $array = array(
    array('id' => 12, 'name' => 'John1', 'surname' => 'Smith1'),
    array('id' => 13, 'name' => 'John2', 'surname' => 'Smith2'),
    array('id' => 14, 'name' => 'John3', 'surname' => 'Smith3'),
    array('id' => 15, 'name' => 'John4', 'surname' => 'Smith4'),
 );

 foreach($array as &$a) {
    $a['middlename'] = 'Robert';
 }

下面的内容表明$array 完美无缺:

print('<pre>'.print_r($array,true).'</pre>'); 结果:

    Array
    (
        [0] => Array
            (
                [id] => 12
                [name] => John1
                [surname] => Smith1
                [middlename] => Robert
            )

        [1] => Array
            (
                [id] => 13
                [name] => John2
                [surname] => Smith2
                [middlename] => Robert
            )

        [2] => Array
            (
                [id] => 14
                [name] => John3
                [surname] => Smith3
                [middlename] => Robert
            )

        [3] => Array
            (
                [id] => 15
                [name] => John4
                [surname] => Smith4
                [middlename] => Robert
            )

    )

但是当我循环它时,内部指针在最后一个元素之前停止:

 foreach($array as $a) {
     print('<pre>'.print_r($a['id'],true).'</pre>');
 }

输出:

 12
 13
 14
 14

有什么提示吗?

更新:我选择的答案是正确的,而且我发现了这个:PHP Pass by reference in foreach 谢谢,所以。

【问题讨论】:

  • 在连续的foreach 循环中使用相同的变量会导致一些奇怪的行为 - 如果可以的话,我会找到链接。在两个循环之间尝试unset $a
  • 在 foreach (php.net/manual/en/control-structures.foreach.php) 的文档中关于循环变量引用一节中明确警告了这一点。 “$value 的警告引用和最后一个数组元素即使在 foreach 循环之后仍然存在。建议通过 unset() 销毁它。”

标签: php arrays loops reference pass-by-reference


【解决方案1】:

我遇到了类似的问题,当使用foreach 修改数组然后访问该数组时。我的猜测是,您不会在循环后破坏引用,而是意外覆盖了该值。在你的 foreach 之后尝试unset($a);

【讨论】:

    【解决方案2】:

    我建议不要使用像 $array 这样的变量名,以防万一......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-17
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多