PHP按键反向排序子数组

时间:2013-03-29 22:21:55

标签: php sorting multidimensional-array usort

嘿伙计们,我正试图用usort反向排序一个多维数组但是在某个地方搞乱了。这是我的代码:

$array = array(
    array(123 => 'foo'), // duplicate
    array(124 => 'foo'),
    array(127 => 'foo'),
    array(126 => 'foo'),
    array(123 => 'foo'), // duplicate
    array(125 => 'foo'),
);

function rcmp($a, $b) {
    if($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

usort($array, 'rcmp');

print_r($array);

/*
    Array
    (
        [0] => Array ( [126] => foo) )
        [1] => Array ( [125] => foo) )
        [2] => Array ( [127] => foo) )
        [3] => Array ( [123] => foo) )
        [4] => Array ( [124] => foo) )
        [5] => Array ( [123] => foo) )
    )
*/

我期待

/*
    Array
    (
        [0] => Array ( [127] => foo) )
        [1] => Array ( [126] => foo) )
        [2] => Array ( [125] => foo) )
        [3] => Array ( [124] => foo) )
        [4] => Array ( [123] => foo) )
        [5] => Array ( [123] => foo) )
    )
*/

我做错了什么?

3 个答案:

答案 0 :(得分:2)

当你的比较函数rcmp被调用时,它的参数$a$b是数组,所以你的相等和少于运算符的数组作为它们的操作数。

数组上的相等运算符有效like this

TRUE if $a and $b have the same key/value pairs.

小于比较的作品like this

  

如果在操作数2中找不到操作数1的键,则具有较少成员的数组较小   数组是无法比较的,否则 - 按值比较值。

“无法比较”表示比较评估为null,这反过来导致rcmp返回1

所以最终发生的事情是$a$b不相同的数组rcmp always returns 1(即认为$a更大)。无论每个数组中的键是什么,都会发生这种情况,因此您会得到无意义的排序。

如果您想通过usort的第一个键对这些数组进行排序,您可以这样做:

function rcmp($a, $b)
{
    return key($a) - key($b);
}

答案 1 :(得分:1)

如果要比较数组的索引,必须在比较函数中提取索引并按降序反转比较

function rcmp($a, $b) {
    $a = array_keys($a);
    $b = array_keys($b);

    if($a[0] == $b[0]) {
        return 0;
    }

    return ($a[0] < $b[0]) ? 1 : -1;
}

答案 2 :(得分:0)

这是我提出的使用create_function的解决方案,尽管接受了最佳答案。谢谢,希望这有助于其他人。     $ array = array(         数组(124 =&gt;'foo'),         数组(123 =&gt;'foo'),//重复         数组(127 =&gt;'foo'),         数组(126 =&gt;'foo'),         数组(123 =&gt;'foo'),//重复         数组(125 =&gt;'foo'),     );

usort($array, create_function('$a, $b','return (key($a) == key($b)) 
                                                ? 0 
                                                : (key($a) < key($b)) 
                                                   ? -1 
                                                   : 1;'));

print_r($array);