使用usort对多维数组进行排序

时间:2011-06-08 23:06:48

标签: php usort

以下usort函数并不总是给出正确的结果,因为它只会相对于比较项目向上或向下“推”一个位置。因此,当多次执行排序时,结果Yes No Yes No可能会发生。

该功能成功排序字段b。

我该如何解决这个问题?

阵列

[0] => array("a"=>"Yes","b"=>"apple"...);
[1] => array("a"=>"Yes","b"=>"banana"...);
[2] => array("a"=>"No","b"=>"lemon"...);
[3] => array("a"=>"No","b"=>"grape"...);
...

当前功能

function sortAnserDesc($x, $y){
    if ( $x['a'] == $y['a'] )
     return 0;
    else if ( $x['a'] < $y['a'] )
     return 1;
    else
     return -1;
}

2 个答案:

答案 0 :(得分:0)

我在http://www.php.net/manual/en/function.usort.php#103722找到了一个非常好的功能 我认为你有一个普遍的问题。

我尝试在这里显示回调函数。

 function usortByArrayKey($key, $asc=SORT_ASC) {
    $sort_flags = array(SORT_ASC, SORT_DESC);

    if (!in_array($asc, $sort_flags))
        throw new InvalidArgumentException('sort flag only accepts SORT_ASC or SORT_DESC');

    return function(array $a, array $b) use ($key, $asc, $sort_flags) {
                if (!is_array($key)) { //just one key and sort direction
                    if (!isset($a[$key]) || !isset($b[$key])) {
                        throw new Exception('attempting to sort on non-existent keys');
                    }
                    if ($a[$key] == $b[$key])
                        return 0;
                    return ($asc == SORT_ASC xor $a[$key] < $b[$key]) ? 1 : -1;
                } else { //using multiple keys for sort and sub-sort
                    foreach ($key as $sub_key => $sub_asc) {
                        //array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which
                        if (!in_array($sub_asc, $sort_flags)) {
                            $sub_key = $sub_asc;
                            $sub_asc = $asc;
                        }
                        //just like above, except 'continue' in place of return 0
                        if (!isset($a[$sub_key]) || !isset($b[$sub_key])) {
                            throw new Exception('attempting to sort on non-existent keys');
                        }
                        if ($a[$sub_key] == $b[$sub_key])
                            continue;
                        return ($sub_asc == SORT_ASC xor $a[$sub_key] < $b[$sub_key]) ? 1 : -1;
                    }
                    return 0;
                }
            };
}

要与您的代码集成,您可能会有类似的内容:

  1. 仅通过DESCENDING对a值进行排序。

    usort($YOUR_ARRAY, usortByArrayKey('a', SORT_DESC));

  2. ab进行排序。

    usort($YOUR_ARRAY, usortByArrayKey(array('a', 'b')));

  3. 有关按DESCENDING

    排序ab的详情

    usort($YOUR_ARRAY, usortByArrayKey(array('a', 'b')), SORT_DESC);

  4. 希望这有帮助!!

答案 1 :(得分:0)

为什么不直接使用strcmp功能?

function sortAnserDesc($x, $y){
    return strcmp($x['a'],$y['a']);
}