为数组分配新索引会导致创建新数组吗?

时间:2011-12-31 20:01:37

标签: php arrays

我正在使用OpenCart并将此类代码添加到Controller以向用户显示所有制造商:

  $this->load->model("catalog/manufacturer");
  $manufacturers = $this->model_catalog_manufacturer->getManufacturers();
  $allbrands = array();
  foreach ($manufacturers as $brand)
  {
    $brand["url"] = $this->url->link("product/manufacturer/product&manufacturer_id=".(string) $brand["manufacturer_id"],"","SSL");
    $allbrands[] = $brand;
  }

  $this->data["manufacturers"] = $allbrands;

它工作得很好,但我之前的代码不起作用,如下所示:

  $this->load->model("catalog/manufacturer");
  $manufacturers = $this->model_catalog_manufacturer->getManufacturers();
  $allbrands = array();
  foreach ($manufacturers as $brand)
  {
    $brand["url"] = $this->url->link("product/manufacturer/product&manufacturer_id=".(string) $brand["manufacturer_id"],"","SSL");
  }

  $this->data["manufacturers"] = $manufactures;

我在想的是数组是对象所以它们指向引用,所以如果我更改$brand变量,那么$manufacturers也会有"url"作为索引的数组但不是工作和PHP抱怨它没有任何"url"索引。

为数组分配新索引会导致使用堆中的新对象重新创建它还是扩展当前对象在堆中的位置?

任何想法,它会发生什么?

2 个答案:

答案 0 :(得分:2)

foreach [docs]正在创建数组值的副本:

  

为了能够使用$value&之前的循环中直接修改数组元素。在这种情况下,该值将通过引用分配。

  

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

这应该有效:

foreach ($manufacturers as &$brand) {
    $brand["url"] = $this->url->link("product/manufacturer/product&manufacturer_id=".(string) $brand["manufacturer_id"],"","SSL");
}
unset($brand);

答案 1 :(得分:1)

foreach创建对象的临时副本。修改循环内foreach中引用的数组并不是一个好主意。

您应该使用指针在循环内进行修改。

以下是从docs复制的示例。

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>