0

嘿伙计们,我正在尝试使用 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) )
    )
*/

我究竟做错了什么?

4

3 回答 3

2

当您的比较函数rcmp被调用时,它的参数$a$b是数组,因此您的相等和小于运算符将数组作为其操作数。

数组上的相等运算符的工作方式如下

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

小于比较的工作方式如下

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

“不可比较”表示比较结果为null,这反过来又导致rcmp返回1

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

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

function rcmp($a, $b)
{
    return key($a) - key($b);
}
于 2013-03-29T22:28:53.150 回答
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;
}
于 2013-03-29T22:31:29.383 回答
0

Here's a solution using create_function that I came up with, accepting the best answer though. Thanks and hope this helps someone else out. $array = array( array(124 => 'foo'), array(123 => 'foo'), // duplicate array(127 => 'foo'), array(126 => 'foo'), array(123 => 'foo'), // duplicate array(125 => 'foo'), );

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

print_r($array);
于 2013-03-29T22:40:52.817 回答