【问题标题】:Pass-by-reference the third parameter in PHP array_walk, without a warning通过引用传递 PHP array_walk 中的第三个参数,没有警告
【发布时间】:2025-12-20 17:40:06
【问题描述】:

有没有办法让这段代码在没有警告的情况下工作?

function myFunction($value, $key, &$array)
{
     if (strlen($value)<=2) $array[] = $key.$value;
}
$a = array("aa", "bbb", "cc", "dd");
$resultA = array();
array_walk($a, 'myFunction', &$resultA);
// now '$resultA' should contain: Array([0] => aa0 [1] => cc2 [2] => dd3)

它有效,但它总是抛出这个警告消息:

警告:调用时传递引用 已被弃用 path_to\index.php 在第 7 行

我认为从调用中删除与号应该足以使警告消失,但奇怪的是,如果我只在“myFunction”中指定 &,“array_walk”不会计算第三个参数。 要使其正常工作,调用中也必须有一个 &,但它会触发警告。

此外,作为临时解决方法,我尝试将 php.ini var "allow_call_time_pass_reference" 设置为 true,但我仍然收到警告...

我想知道可能有更好/首选的方法来将用户定义的函数应用于数组的每个元素,并带有一个通过引用传递的参数。

【问题讨论】:

  • 告诉我php版本。
  • @Guarav 5.3 会抛出已弃用的错误,而不是警告,可能是 5.2
  • 您好,它是在 IIS7 下运行的 5.2 版。 @Andy 猜对了:)

标签: php


【解决方案1】:

简短的回答是你不能用数组遍历来做到这一点。但是,您确实有一些选择:

使用闭包(在 PHP >= 5.3.0 中可用):

$myArray = array();
$callback = function ($key, $value) use (&$myArray) {
    if (strlen($value) <= 2) {
        $myArray[] = $key . $value;
    }
};
array_walk($a, $callback);

创建一个filter iterator(注意这可能有点矫枉过正):

class myFilterIterator extends FilterIterator {
    public function accept() {
        return strlen(parent::current()) <= 2;
    }
    public function current() {
        return parent::key() . parent::current();
    }
}
$it = new myFilterIterator(new ArrayIterator($a));
$newArray = iterator_to_array($it);

还有其他方法,但是您添加键和值确实使映射样式解决方案变得困难...

【讨论】:

  • 我不能在 php 5.2 中使用 clousures。我会选择 txyoji 解决方案,因为它对我来说特别简单,因为我不知道 FilterIterator 抽象类,因此它更类似于“我的平均”php代码。无论如何,感谢您的建议!
  • 第一个解决方案中的参数顺序错误。它们应该是 ($value, $key)
【解决方案2】:

array_walk 的第三个参数不是通过引用传递的,所以这不起作用。 除了函数,您可以使用对象方法作为回调并将结果累积到对象中。

Class myClass
{
 public values;
 public function myCallback($value,$key)
 {
   if (strlen($value)<=2){
       $this->values[] = $key.$value;
   }
 }
}
$a = array("aa", "bbb", "cc", "dd");
$obj = new myClass();
array_walk($a, array($obj,'myCallback'));

或者你可以在回调函数中定义一个全局变量。

function myFunction($value, $key)
{
   global $array;    
   if (strlen($value)<=2) $array[] = $key.$value;
}

both are valid.

【讨论】:

  • 第一个解决方案中的参数顺序错误。它们应该是 ($value, $key)
  • @hyponym 很好。已在示例中修复。
最近更新 更多