PHP要使用的附加参数


PHP additional parameters to usort

下面的代码放置在一个函数中,该函数本身放置在一个类中。它的目的是避免每个$filter value有一个排序函数:

$GLOBAL['filter'] = $filter;
usort($this->data, function($arr1, $arr2) {
    return ($arr1[$GLOBALS['filter']] > $arr2[$GLOBALS['filter']]) ? 1 : -1;
});

我的解决方案工作得很好,但我发现它相当不优雅。有没有人有一个想法,以实现相同的目标,而不诉诸于$GLOBALS变量?

谢谢你的建议

由于使用的是匿名函数,因此可以像这样将其用作闭包:

$filter = <whatever>;
usort($this->data, function($arr1, $arr2) use ($filter) {
    return ($arr1[$filter] > $arr2[$filter]) ? 1 : -1;
});
   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 eg: {name: 'asc',年龄:'desc'}和$listToSort是数组的数组eg: array(array('name': 'Himanshu',年龄:22),array('name': 'Steve',年龄:35))

将此代码放在项目的Utils.php中,因为它是通用解决方案。

在现代PHP中,有更好的工具可用。

从PHP7开始,太空船操作符(<=>)可以进行3-way比较。这比"大于/小于"更可靠。双向比较。

从PHP7.4开始,箭头函数允许更简洁的语法,并且不需要use()

代码:

usort($this->data, fn($arr1, $arr2) => $arr1[$filter] <=> $arr2[$filter]);

如果$filter中的值可能不作为数组中的键存在,那么您可以使用??(空合并操作符)回退到默认值

usort(
    $this->data,
    fn($arr1, $arr2) => ($arr1[$filter] ?? $fallback) <=> ($arr2[$filter] ?? $fallback)
);