2012-12-06 37 views
0

我有兩個數組,都具有相同的索引。我想要做的是循環訪問一個數組(portConfigArray),並使用第二個數組中的數據更改現有項目的值。 (portStatusArray) 這裏的邏輯:試圖通過數組循環並重新分配值

$i=0; 
foreach ($portConfigArray as $configentry) 
{   
    $configentry['LinkState'] = $portStatusArray[$i]['LinkState']; 
    $i = $i + 1; 
    echo $configentry['LinkState'];    
} 
$portdetailsArray = $portConfigArray; 
var_dump($portdetailsArray); 

回波語句顯示被分配爲在portConfigArray每個項的正確的值。 (它只是一個字符串值,如「Up」或「Down」) 但是在var_dump中,我可以看到該值沒有被正確更新。它顯示

["LinkState"]=> string(0) "" 

作爲每個記錄的輸出。

你能告訴我我做錯了什麼嗎?

回答

1

你需要讓$configentry的引用,否則它只是一個副本

foreach ($portConfigArray as &$configentry) 
+0

這可能會炸燬你,因爲$ configentry將保留一個引用,直到你unset()它或腳本結束。如果您稍後在腳本中重複使用$ configentry,您將會更改您foreach的最後一個元素,這可能會導致嚴重的混淆。 –

+0

同意。使用引用時,你應該始終勤奮。 –

1
foreach ($portConfigArray as $configentry) 

應該

foreach ($portConfigArray as &$configentry) 

本質上講,這意味着實際的價值,而不是它的一個副本的循環交易。

0

雖然可以使$ configentry參考,在其他的答案說,它可能會導致大問題,如果你再用這種「引用「稍後在腳本中用於其他目的的變量。更安全的方法是使用的foreach的密鑰=> VAL版本,並直接修改陣列:

foreach($portConfigArray as $key => $configentry) { 
    $portConfigArray[$key] = 'newvalue'; 
} 

參考版本可能導致的問題,例如

php > $a = array('a', 'b', 'c'); 
php > foreach($a as &$val) { $val++; }; 
php > print_r($a); 
Array 
(
    [0] => b 
    [1] => c 
    [2] => d 
) 
php > $b = array('p', 'q', 'r'); 
php > foreach($b as $val) { $val++; }; <--note, $val, not &$val 
php > print_r($b); 
Array 
(
    [0] => p <---hey, these 3 didn't change! 
    [1] => q 
    [2] => r 
) 
php > print_r($a); 
Array 
(
    [0] => b 
    [1] => c 
    [2] => s <---uh-oh! 
) 
php >