在PHP array_walk中传递引用第三个参数,没有警告

时间:2011-03-01 13:53:14

标签: php

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

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行

我认为从调用中移除&符应该足以使警告消失,但是,奇怪的是,如果我只指定&amp;,则“array_walk”不会显示第三个参数。在“myFunction”中。 为了使它工作,必须有一个&amp;在通话中,但它会触发警告。

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

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

2 个答案:

答案 0 :(得分:13)

简短的回答是你不能用数组漫游做到这一点。但是,你确实有一些改变:

使用闭包(在PHP&gt; = 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);

还有其他方法,但你附加了关键和价值确实使得绘制风格解决方案变得困难......

答案 1 :(得分:4)

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.