Php foreach通过引用传递的替代方案
我遇到过这样一种情况,foreach中的值通过引用传递以修改元素,然后在代码的稍后阶段,相同的数组再次循环以进行一些计算,但这次元素是通过值传递的。问题是PHP在第一个foreach中保留对数组中最后一个元素的引用,然后在下一个foreach启动时覆盖该元素(如果局部变量具有相同的名称) 示例代码:Php foreach通过引用传递的替代方案,php,foreach,pass-by-reference,Php,Foreach,Pass By Reference,我遇到过这样一种情况,foreach中的值通过引用传递以修改元素,然后在代码的稍后阶段,相同的数组再次循环以进行一些计算,但这次元素是通过值传递的。问题是PHP在第一个foreach中保留对数组中最后一个元素的引用,然后在下一个foreach启动时覆盖该元素(如果局部变量具有相同的名称) 示例代码: <?php $a = array("a" => "foo"); $b = array("b" => "bar"); $x = array($a, $b); foreach ($
<?php
$a = array("a" => "foo");
$b = array("b" => "bar");
$x = array($a, $b);
foreach ($x as &$y) {}
print_r($x);
foreach ($x as $y) {}
print_r($x);
?>
这将产生
Array
(
[0] => Array
(
[a] => foo
)
[1] => Array
(
[b] => bar
)
)
Array
(
[0] => Array
(
[a] => foo
)
[1] => Array
(
[a] => foo
)
)
排列
(
[0]=>阵列
(
[a] =>foo
)
[1] =>阵列
(
[b] =>巴
)
)
排列
(
[0]=>阵列
(
[a] =>foo
)
[1] =>阵列
(
[a] =>foo
)
)
PHP手册中说明了这一荒谬之处
警告即使在foreach循环之后,$值和最后一个数组元素的引用仍然存在。建议通过unset()将其销毁
实际上,使用unset($y)
可以解决这个问题。但这是非常脆弱的,你不能依赖于程序员总是记得取消设置一个范围不明显的变量。因此,我的问题是:有没有什么好的方法可以替代foreach通过引用传递,从而消除事后取消设置变量的需要?您可以使用:
这使引用$y
成为回调函数作用域的局部引用,以便自动处理取消设置。您可以使用关联(索引)foreach:
通过这种方式,您可以轻松修改原始数组元素…您给出的示例没有给出任何关于为什么需要在此处使用引用的线索。
$a=array(“a”=>“foo”)$b=阵列(“b”=>“条”)$x=阵列($a,$b)
您确定不想使用array_merge()代码>?@raina77ow这真的相关吗?代码只是指出了缺陷。您只需要知道变量需要修改。@php\u coder\u 3809625array\u merge()
确实更好,但它不会改变代码的行为。@php\u coder\u 3809625这是正确的。但数组是否为n维并不重要。该值仍然被覆盖。@php_coder_3809625否,他要求提供“foreach pass by reference的替代方案”。这是一个正确的答案。谢谢。这就是我最后使用的。另外值得注意的是,要使外部变量在匿名函数中可用,必须使用。
array_walk($x, function(&$y) {
/* ... */
});
foreach ($x as $index=>$y)
{
if ($y=='remove') {unset($x[$index]);}
}