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

时间:2011-05-11 15:25:22

标签: 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;
}

显然,这并不理想,因为搜索密钥很难编码。我以为我会通过将键作为参数传递给外部函数来使这个泛型,但是这在内部函数中是超出范围的。我试图通过使用一个闭包来解决这个问题,闭包可以访问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;
}

但是usort()只接受一个函数名,所以这不起作用。有人能看到(更好吗?)实现这个目标的方法吗?

2 个答案:

答案 0 :(得分:14)

  

闭包也可以继承变量   来自父范围。任何这样的   变量必须在。中声明   功能标题。继承变量   来自父范围是不一样的   使用全局变量。全球   变量存在于全局范围内,   无论如何都是一样的   功能正在执行。父母   闭包的范围是函数   封闭被宣布(不是   必然是它被称为的功能   从)。

  • 还请注意,定义闭包并将其赋值给变量是一种正常的赋值操作,因此在闭包;之后需要}

进行这些更改后,您的代码看起来像这样(并且应该可以正常工作):

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

答案 1 :(得分:2)

要弄清这一点-并将其编码为闭包-并使用PHP7飞船运算符-并纠正第一个答案的第4行中的错字,请跳过$ ascending变量:

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