为什么我不能在foreach循环中将元素推入子数组?

时间:2013-06-27 14:21:50

标签: php arrays foreach array-push indexed

我正在尝试了解每个循环中的数组,这可能对许多人来说很明显。

当我遍历我的多维数组时,我试图找到没有第三个元素的子数组。如果它们没有第三个元素,我想在具有特定值的子数组中添加第三个元素。

$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";
    };
}

不会抛出任何错误但没有任何反应。当我使用for each循环时:

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

它按预期工作。

对于长序言,很抱歉,我的问题是:

为什么这两个foreach循环没有做同样的事情?谢谢!

3 个答案:

答案 0 :(得分:4)

因为您需要访问$ testArray条目“参考

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

答案 1 :(得分:2)

这里的问题在于foreach迭代遍历迭代并按值设置迭代变量。这意味着您在$array中处理的foreach$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中使用}关闭块之后不需要分号,除非您正在执行类似于为变量分配闭包的操作: / p>

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

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

答案 2 :(得分:0)

foreach循环不会通过引用传递元素。要让第一个数组做你想做的事,它必须是:

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