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";
}
}
这与PHP的引用一致,其中一个变量可以引用另一个变量,如下所示:
$a = array(1, 2, 3);
$b = &$a;
$b[] = 4;
print_r($a); // 1, 2, 3, 4
您遇到类似的功能现象:
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
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