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

2023-12-24

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

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)

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

警告:调用时间按引用传递 已被弃用 路径\index.php 7号线

我认为从调用中删除 & 符号应该足以使警告消失,而且确实如此,但是,奇怪的是,如果我只在“myFunction”中指定 & ,“array_walk”不会计算第三个参数。为了使其工作,通话中也必须有一个 &,但随后它会触发警告。

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

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


简短的回答是你不能用 array_walk 做到这一点。但是,您确实有一些替代方案:

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

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

创建一个过滤迭代器 http://php.net/manual/en/class.filteriterator.php(请注意,这可能有点矫枉过正):

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);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP array_walk 中按引用传递第三个参数,没有警告 的相关文章

随机推荐