【问题标题】:Understanding how PHP treats references to arrays了解 PHP 如何处理对数组的引用
【发布时间】:2015-07-12 03:32:41
【问题描述】:

在 PHP 5.5.33 中,我想在重复循环中创建一个数组数组。我发现了 3 种不同的方法,它们给出了 3 种不同的结果。第一个结果是我想要的结果,所以我有一个解决方案。我需要的是了解为什么这三种方式会导致不同的结果。

前两个例子对我来说很有意义。第三个似乎应用了外星逻辑。在第三个示例中,我在每次迭代时创建一个对新数组的新引用,但每次都将相同的引用添加到输出数组中。为什么 $inner 在上一个示例中每次都没有在新的内存地址处重新创建?

<?php
// Inner array added after it is changed
$outer = array();
for ($ii=0; $ii<3; $ii++) {
  $inner = array("value" => 0);
  $inner["value"] = $ii;
  $outer[$ii] = $inner;
}

echo json_encode($outer);
// [{"value":0},{"value":1},{"value":2}] 
?>

<br />

<?php
// Innner array added as a copy, and then changed
$outer = array();
for ($ii=0; $ii<3; $ii++) {
  $inner = array("value" => 0);
  $outer[$ii] = $inner;
  $inner["value"] = $ii;
}

echo json_encode($outer);
// [{"value":0},{"value":0},{"value":0}] 
?>

<br />

<?php
// Inner array created, then added by reference, then changed
$outer = array();
for ($ii=0; $ii<3; $ii++) {
  $inner = array("value" => 0); // shouldn't this be different each time?
  $outer[$ii] = &$inner;
  $inner["value"] = $ii;
}

echo json_encode($outer);
// [{"value":2},{"value":2},{"value":2}]
?>

【问题讨论】:

    标签: php arrays pass-by-reference


    【解决方案1】:

    这很简单 - 在第 3 个示例中,您正在创建变量 $inner['value'] 的 3 个同义词数组。每次都将 $inner['value'] 更改为 $ii。最后,您有 3 个指针数组,它们指向 $inner['value'],但 $inner['value'] 获得了 2 - 即结果。

    如果您期望 $inner = array("value" => 0);将采取不同的方式 - 你的方式不对。如果您清空并创建数组,则这是相等的 - 它每次都会重置数组。

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2015-02-05
      • 2014-02-05
      • 2017-09-08
      相关资源
      最近更新 更多