2011-12-31 53 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 
?>