gpt4 book ai didi

php - 如何传递对回调函数的引用以在带有额外参数的 array_filter 中使用?

转载 作者:可可西里 更新时间:2023-11-01 00:03:24 26 4
gpt4 key购买 nike

我的方法的签名如下所示:

public function ProgramRuleFilter(&$program, $today=null) {

当我这样调用它时,

$programs = array_filter($programs, array($this,'ProgramRuleFilter'));

一切都按预期进行。 ProgramRuleFilter 方法更新 $program 数组,如果成功则返回 true/false,从而正确过滤 $programs

但是,现在我想向过滤器传递一个额外的参数,$today。我该怎么做?

我正在尝试像这样调用它:

$programs = array_filter($programs, new CallbackArgs(array($this,'ProgramRuleFilter'),$today));

使用这个小类作为包装器:

class CallbackArgs {
private $callback;
private $args;

function __construct() {
$args = func_get_args();
$this->callback = array_shift($args);
$this->args = $args;
}

function __invoke(&$arg) {
return call_user_func_array($this->callback, array_merge(array($arg),$this->args));
}
}

但是程序没有被更新,所以沿线的某个地方它丢失了对原始对象的引用。我不确定如何解决这个问题。

最佳答案

array_filter 的第二个参数必须是回调;这意味着 array_filter 本身将调用您的过滤器函数。没有办法告诉 array_filter 以任何其他方式调用该函数,因此您需要找到一种方法将 $today 的值放入您的函数中其他方式。

这是何时使用闭包的完美示例,它可以让您将一些数据(在本例中为 $today 的值)绑定(bind)到函数/回调中。假设您使用的是 PHP 5.3 或更高版本:

// Assuming $today has already been set

$object = $this; // PHP 5.4 eliminates the need for this
$programs = array_filter( $programs, function( $x ) use ( $today, $object ){
return $object->ProgramRuleFilter( $x, $today );
});

这定义了一个内联闭包,使用来自父作用域的 $today$object 的值,然后调用您现有的函数 ProgramRuleFilter 在那个 $object 上。 (有点不寻常的 $object = $this 绕过了一个事实,否则闭包将无法调用对象实例上的方法。但是在 PHP 5.4 中,您可以替换 $ object with $this inside the closure.)

现在,这是一种有点不雅的方式,因为这个闭包所做的只是将工作交给 ProgramRuleFilter 函数。更好的方法是使用闭包而不是函数。所以:

// Assuming $today has already been set

$filter = function( $x ) use ( $today ){
// Cut and paste the contents of ProgramRuleFilter() here,
// and make it operate on $x and $today
};
$programs = array_filter( $programs, $filter );

哪种变体最适合您将取决于应用其余部分的实现。祝你好运!

关于php - 如何传递对回调函数的引用以在带有额外参数的 array_filter 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10250364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com