我有一个数组排序功能如下:
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()只接受一个函数名,所以这不起作用。有人能看到(更好吗?)实现这个目标的方法吗?
答案 0 :(得分:14)
use
关键字让函数“看到”某个变量(或变量)。另请参阅PHP documentation about Anonymous functions。闭包也可以继承变量 来自父范围。任何这样的 变量必须在。中声明 功能标题。继承变量 来自父范围是不一样的 使用全局变量。全球 变量存在于全局范围内, 无论如何都是一样的 功能正在执行。父母 闭包的范围是函数 封闭被宣布(不是 必然是它被称为的功能 从)。
;
之后需要}
。进行这些更改后,您的代码看起来像这样(并且应该可以正常工作):
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;
}