2013-06-27 44 views
3

我想了解一些關於數組的內容,可能對很多人都很明顯。爲什麼不能將元素推到foreach循環的子數組中?

當我循環通過我的多維數組時,我試圖找到沒有第三個元素的子數組。如果他們沒有第三個元素,我想添加第三個元素到具有特定值的子數組。

$testArray = array (
    array("Green", "Yellow", "Blue"), 
    array("Brown", "Silver"), 
    array("Orange", "Pink", "Black"), 
); 

當我使用foreach循環:

foreach ($testArray as $key => $array) { 
    if (count($array) == '2') { 
     $array[] = "None"; 
    }; 
} 

不會引發任何錯誤,但沒有任何反應。當我使用每個循環:

foreach ($testArray as $key => $array) { 
    if (count($array) == '2') { 
     $testArray[$key][] = "None"; 
    }; 
} 

它按預期工作。

很抱歉的長前導,我的問題是:

爲什麼沒有這兩個foreach循環做同樣的事情?謝謝!

+0

謝謝大家的答案,這已經非常有益。 – jreidko

回答

2

這裏的問題在於事實的foreach遍歷iterables和值設置迭代變量。這意味着您在foreach中處理的$array$testArray的值不同。

爲了記住這點(並避免引入$index變量來改變數組中的項目),您需要告訴foreach到pass the value by reference。引用是PHP對C風格指針的回答。如果一個變量引用另一個變量,那麼這兩個變量指向相同的值,所以對其中一個內容的修改實際上是對另一個的修改。在你foreach,您可以用&$array有循環傳給你的$testArray項目引用而不是按值:

foreach ($testArray as $key => &$array) { 
    if (count($array) == '2') { 
     $array[] = "None"; 
    } 
} 

Codepad Demo

這會將與PHP的引用,其中一個變量可以是作出引用,像這樣的另一個:

$a = array(1, 2, 3); 
$b = &$a; 
$b[] = 4; 

print_r($a); // 1, 2, 3, 4 

Codepad Demo

您遇到類似現象與功能:

function byValue($a) { 
    $a[] = 4; 
} 

function byRef(&$a) { 
    $a[] = 5; 
} 

$a = array(1, 2, 3); 

byValue($a); 
print_r($a); // 1, 2, 3 

byRef($a); 
print_r($a); // 1, 2, 3, 5 

Codepad Demo

references section of the PHP docs有這個語法foreach一些例子。還請注意this (somewhat) related, but interesting read on foreach and references


此外,在一個不相關的音符,如果你不知道:你不需要在PHP關閉塊與},除非你正在做一些像給一個變量分配結束後分號:

$someFunc = function($a) { return $a; }; //need one here 

if(1 + 2 == 4) { 
    echo "I just broke math"; 
} // but you don't need one here 
+0

非常感謝Php,非常全面的回答,並且對理解引用如何工作非常有幫助。也感謝所有回答的人。 – jreidko

+0

另外,對分號的評論很好,作爲初學者,我發現這些基本技巧非常寶貴!乾杯 - jreidko – jreidko

4

因爲你需要 「通過引用」 訪問$ testArray項

foreach ($testArray as &$array) { 
    if (count($array) == 2) { 
     $array[] = "None"; 
    }; 
} 
unset($array); 
0

foreach循環不按引用傳遞的元素。爲了得到第一個數組做你想做的,它必須是:

foreach ($testArray as $key => &$array) { 
    if (count($array) == '2') { 
     $array[] = "None"; 
    }; 
} 
相關問題