我从Javascript来到Php,我无法理解为什么,要获得,转换并返回Php中的数组,你必须使用"&"又名"参考" foreach中的符号()......
$some_array = array(1, 2, 3);
function test($a) {
foreach ($a as $k => &$v) {
$v = 'Hello!';
};
return $a;
};
$result = test($some_array);
var_dump($result); // array('Hello!', 'Hello!', 'Hello!');
但是:
function test($a) {
foreach ($a as $k => $v) {
$v = 'Hello!';
};
return $a;
};
[...]
var_dump($result); // array(1, 2, 3)
答案 0 :(得分:3)
要了解“通过值传递”和“通过引用传递”的内容,您应该阅读the docs:
默认情况下,函数参数按值传递(因此,如果函数中的参数值发生更改,则不会在函数外部更改)。要允许函数修改其参数,必须通过引用传递它们。
要使函数的参数始终通过引用传递,请在函数定义中为参数名称添加&符号(&)。
foreach
上的文档构建also states:
为了能够使用
$value
在&
之前的循环中直接修改数组元素。在这种情况下,该值将通过引用分配。
您可以选择通过引用传递并直接更改值(&$v
),也可以选择按值传递,但在这种情况下,您必须使用{{中的元素键更改数组值1}}:
$k
答案 1 :(得分:3)
如果您只是将数组传递给foreach而不使用引用public class TestUncheck {
public static Runnable uncheck(Callable<Void> r) {
return () -> {
try { r.call(); }
catch (Exception e) { throw new RuntimeException(e); }
};
}
public static void main(String[] args) {
new Thread(uncheck(
() -> {
System.out.println("Zzz");
Thread.sleep(1000);
return null;
}
)).start();
}
}
,那么您将把数组的副本传递给foreach。
然后,当您对阵列(副本)进行更改时,您将对副本进行更改。当foreach结束时,课程的副本将被丢弃。
因此,当foreach完成后返回&
时,实际上是将返回传递给函数的副本作为参数,该副本未更改。
即使您通过引用将数组传递给函数也没有区别,因为它是使用一次性副本或使用原始数组的foreach,具体取决于{{1在实际的foreach代码行中引用指令。