2011-12-31 48 views
1

我工作Opencart的,并添加这样的代码到控制器来显示所有的厂商用户:将新的索引分配给数组会导致新的数组创建?

$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

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); 
+0

真棒回答很棒。 Thnaks。 – Tarik 2011-12-31 20:08:14

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 
?>