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)
为了澄清这一点 - 并将其编码为闭包 - 并使用 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)
| 归档时间: |
|
| 查看次数: |
7068 次 |
| 最近记录: |