0

Hey guys I'm trying to reverse sort a multidimensional array with usort but am messing up somewhere. Here's my code:

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

I am expecting

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

What am I doing wrong?

4

3 に答える 3

2

比較関数rcmpが呼び出されると、その引数$a$bは配列であるため、等値演算子と小なり演算子はオペランドとして配列を持ちます。

配列の等価演算子は次のように機能します。

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

小なり比較は次のように機能します

オペランド 1 のキーがオペランド 2 で見つからない場合、配列は比較できません。それ以外の場合は、値ごとに比較します。

「比較不能」とは、比較が に評価され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

create_functionこれは私が思いついたものを使用した解決策ですが、最良の答えを受け入れています。ありがとう、これが他の誰かに役立つことを願っています。$array = array( array(124 => 'foo'), array(123 => 'foo'), // 複製 array(127 => 'foo'), array(126 => 'foo'), array( 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);
于 2013-03-29T22:40:52.817 に答える