PHP usort的附加参数

7
下面的代码位于一个类中的函数内部。它的目的是避免每个$filter值都有一个排序函数:
$GLOBAL['filter'] = $filter;
usort($this->data, function($arr1, $arr2) {
    return ($arr1[$GLOBALS['filter']] > $arr2[$GLOBALS['filter']]) ? 1 : -1;
});

我的解决方案完全有效,但我认为它相当不优雅。是否有人有想法在不使用$GLOBALS变量的情况下实现相同的目标?

感谢您的建议。

3个回答

26

因为您正在使用匿名函数,所以可以像这样将其用作闭包:

$filter = <whatever>;
usort($this->data, function($arr1, $arr2) use ($filter) {
    return ($arr1[$filter] > $arr2[$filter]) ? 1 : -1;
});

0
在现代PHP中,有更好的工具可用。
从PHP7开始,太空船运算符(<=>)可用于进行三向比较。这比“大于/小于”二向比较更可靠。
从PHP7.4开始,箭头函数允许更简洁的语法,并消除了use()的需要。
代码:
usort($this->data, fn($arr1, $arr2) => $arr1[$filter] <=> $arr2[$filter]);

如果$filter中的值可能不存在于数组中,则可以使用??(空值合并运算符)返回默认值。这与使用if语句进行检查并设置默认值相比,更加简洁和方便。
usort(
    $this->data,
    fn($arr1, $arr2) => ($arr1[$filter] ?? $fallback) <=> ($arr2[$filter] ?? $fallback)
);

0
   public function sortList($params, $listToSort)
    {
        if (!isset($listToSort) || !isset($params) || count($params) == 0) {
            return $listToSort;
        }
        foreach ($params as $col => $value) {
            $orderFlag = $value == 'asc' ? 1 : -1;
            usort($listToSort, function ($a, $b) use ($orderFlag, $col) {
                return strcmp($a[$col], $b[$col]) * $orderFlag;
            });
        }
    return $listToSort;
}

以上$params是json,例如:{name: 'asc',age: 'desc'},$listToSort是二维数组,例如:array(array('name': 'Himanshu', age: 22),array('name': 'Steve',age: 35))。
将此代码放置在Utils.php中,因为这是一个通用解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接