编程语言
首页 > 编程语言> > php – 为什么我不能将元素推送到foreach循环中的子数组?

php – 为什么我不能将元素推送到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";
    };
}

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

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

它按预期工作.

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

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

解决方法:

这里的问题在于foreach迭代遍历迭代并按值设置迭代变量.这意味着您在foreach中处理的$数组与$testArray的值不同.

为了记住这个(并避免引入$index变量来改变数组中的项),你需要告诉foreach到pass the value by reference.引用是PHP对C风格指针的回答.如果变量引用另一个,则两个变量都指向相同的值,因此对一个内容的修改实际上是对另一个的修改.在你的foreach中,你可以使用& $数组让循环通过引用而不是通过值传递$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

标签:indexed,array-push,php,arrays,foreach
来源: https://codeday.me/bug/20190825/1721106.html