Php 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 ($

我遇到过这样一种情况,foreach中的值通过引用传递以修改元素,然后在代码的稍后阶段,相同的数组再次循环以进行一些计算,但这次元素是通过值传递的。问题是PHP在第一个foreach中保留对数组中最后一个元素的引用,然后在下一个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 3809625
array\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]);}
}