【问题标题】:PHP additional parameters to usortPHP 附加参数进行排序
【发布时间】:2011-11-21 15:55:53
【问题描述】:

以下代码位于一个函数中,该函数本身位于一个类中。其目的是避免每个 $filter 值有一个排序函数:

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

我的解决方案工作得很好,但我觉得它相当不雅。有人会想在不使用 $GLOBALS 变量的情况下实现相同的目标吗?

感谢您的建议

【问题讨论】:

    标签: php usort


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这正是我需要的!我应该早点研究闭包...
    • 完美解决我的问题。谢谢。
    【解决方案2】:
       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', age : 'desc'} 和 $listToSort 是数组的数组 eg: array(array('name': 'Himanshu', age: 22), array ('名字':'史蒂夫',年龄:35))

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多