下面的代码放置在一个函数中,该函数本身放置在一个类中。它的目的是避免每个$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)
);