我正在尝试了解每个循环中的数组,这可能对许多人来说很明显。
当我遍历我的多维数组时,我试图找到没有第三个元素的子数组。如果它们没有第三个元素,我想在具有特定值的子数组中添加第三个元素。
$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循环没有做同样的事情?谢谢!
答案 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";
}
}
这与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中使用}
关闭块之后不需要分号,除非您正在执行类似于为变量分配闭包的操作: / 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";
};
}