2013-06-27 38 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"; 
    }; 
} 
相关问题