PHP按键反向排序子数组



嘿,伙计们,我正试图用ussort对多维数组进行反向排序,但我在某处搞砸了。下面是我的代码:

$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) )
    )
*/

我做错了什么?

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

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;
}

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

数组上的相等操作符是这样的:

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

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

"Uncomparable"是指比较结果为null,这反过来又导致rcmp返回1

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

如果你想用usort按数组的第一个键排序,你可以这样做:

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

这是我想到的一个使用create_function的解决方案,尽管接受最好的答案。谢谢,希望这能帮助到其他人。$array = array(数组(124 => 'foo'),数组(123 => 'foo'),//重复数组(127 => 'foo'),数组(126 => 'foo'),数组(123 => 'foo'),//重复数组(125 => 'foo'),

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

相关内容

  • 没有找到相关文章

最新更新