【问题标题】:Strange foreach loop behaviour in PHP [duplicate]PHP中奇怪的foreach循环行为[重复]
【发布时间】:2016-05-13 12:47:20
【问题描述】:

有人可以解释为什么第二个 foreach 循环输出 ID = 2 的项目两次吗?

第一个循环中的“&”旨在更改真实对象而不是副本。当我将第二个循环中的字段名称 $value 更改为其他内容时,它按预期工作,但我想了解为什么会出现此输出。

$a = array("ID" => "1");
$b = array("ID" => "2");
$d = array("ID" => "3");
$c = array($a, $b, $d);

foreach ($c as &$value)
{
    $value['foo'] = rand(0, 10000);
}

print_r($c);

foreach ($c as $value)
{
    print_r($value);
}

输出:

Array
(
    [0] => Array
        (
            [ID] => 1
            [foo] => 5673
        )

    [1] => Array
        (
            [ID] => 2
            [foo] => 5421
        )

    [2] => Array
        (
            [ID] => 3
            [foo] => 149
        )

)
Array
(
    [ID] => 1
    [foo] => 5673
)
Array
(
    [ID] => 2
    [foo] => 5421
)
Array
(
    [ID] => 2
    [foo] => 5421
)

【问题讨论】:

  • 什么是print_a()函数?
  • 因为$value 是一个参考。
  • 重复问题
  • "print_a" 是我个人的 "print_r" 函数,它只是添加了 "
    "-tags,所以输出在 webbrowser 中的格式很好。我只是将它编辑为“print_r”,因为它与问题无关。

标签: php for-loop foreach


【解决方案1】:

来自一位 SO answer

这是有据可查的 PHP 行为 请参阅 php.net 的 foreach 页面上的warning

警告

$value 的引用和最后一个数组元素即使在 foreach 循环之后仍然存在。建议通过 unset() 销毁。

所以你的代码应该是:

<?php
$a = array("ID" => "1");
$b = array("ID" => "2");
$d = array("ID" => "3");
$c = array($a, $b, $d);

foreach ($c as &$value)
{
    $value['foo'] = rand(0, 10000);
}

print_r($c);

unset($value);

foreach ($c as $value)
{
    print_r($value);
}

输出:

Array
(
    [0] => Array
        (
            [ID] => 1
            [foo] => 6465
        )

    [1] => Array
        (
            [ID] => 2
            [foo] => 4562
        )

    [2] => Array
        (
            [ID] => 3
            [foo] => 2629
        )

)
Array
(
    [ID] => 1
    [foo] => 6465
)
Array
(
    [ID] => 2
    [foo] => 4562
)
Array
(
    [ID] => 3
    [foo] => 2629
)

【讨论】:

  • 酷,您复制粘贴了现有答案。
  • @downvoters:敢说原因?
  • @u_mulder 我已经链接到那个帖子了。引用是违法的吗?而且我还添加了针对他的答案!
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多