可以通过PHP传递一个闭包吗?

ign*_*low 6 php arrays sorting closures usort

我有一个数组排序功能如下:

public function sortAscending($accounts)
{
    function ascending($accountA, $accountB) {
        if ($accountA['AmountUntilNextTarget'] == $accountB['AmountUntilNextTarget']) {
            return 0;
        }
        return ($accountA['AmountUntilNextTarget'] < $accountB['AmountUntilNextTarget']) ? -1 : 1;
    }
    usort($accounts, $ascending);

    return $accounts;
}
Run Code Online (Sandbox Code Playgroud)

显然,这并不理想,因为搜索密钥很难编码.我以为我会通过将键作为参数传递给外部函数来使这个泛型,但是这在内部函数中是超出范围的.我试图通过使用一个闭包来解决这个问题,它可以访问param,而不是内部函数,如下所示:

public function sortAscending($accounts, $key)
{
    $ascending = function($accountA, $accountB) {
        if ($accountsA[$key] == $accountB[$key]) {
            return 0;
        }
        return ($accountA[$key] < $accountB[$key]) ? -1 : 1;
    }
    usort($accounts, $ascending);

    return $accounts;
}
Run Code Online (Sandbox Code Playgroud)

但是usort()只接受函数名,所以这不起作用.任何人都可以看到(更好?)实现这一目标的方式?

kap*_*apa 15

闭包还可以从父作用域继承变量.必须在函数头中声明任何此类变量.从父作用域继承变量与使用全局变量不同.全局变量存在于全局范围内,无论执行什么功能,它都是相同的.闭包的父作用域是声明闭包的函数(不一定是从中调用它的函数).

  • 还请注意,定义一个闭包并将其赋值给一个变量是一个正常的赋值操作,所以你需要;在闭}包后关闭它.

进行这些更改后,您的代码将如下所示(并且应该可以正常工作):

public function sortAscending($accounts, $key)
{
    $ascending = function($accountA, $accountB) use ($key) {
        if ($accountsA[$key] == $accountB[$key]) {
            return 0;
        }
        return ($accountA[$key] < $accountB[$key]) ? -1 : 1;
    };
    usort($accounts, $ascending);

    return $accounts;
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*han 6

为了澄清这一点 - 并将其编码为闭包 - 并使用 PHP7 宇宙飞船运算符 - 并更正第一个答案第 4 行中的拼写错误,请跳过 $ascending 变量:

public function sortAscending($accounts, $key)
{
    usort($accounts, function($accA, $accB) use ($key) {
        return $accA[$key] <=> $accB[$key];
    });
    return $accounts;
}
Run Code Online (Sandbox Code Playgroud)