-2

家が赤、緑、青 (ジョージ: 位置 0、スティーブ: 位置 [1]、フレッド: 位置 [2]) にソートされるように、次の配列をソートするにはどうすればよいですか?

Array
(
    [catOne] => Array
        (
            [0] => Array
                (
                    [Opponent] => Steve
                    [House_Colour] => Green
                )

            [1] => Array
                (
                    [Opponent] => Fred 
                    [House_Colour] => Blue
                )

            [2] => Array
                (
                    [Opponent] => George 
                    [House_Colour] => Red
                )
        )

    [catTwo] => Array
        (
            [0] => Array
                (
                    [Opponent] => Peter 
                    [House Colour] => Green
                )

        )

)

sort()、asort()、および usort() を使用してみましたが、必要なものは何もありませんか?

編集:並べ替えは簡単に変更できる必要があります。ハウスカラーの順序は問いません。使用する順番は一例です。

4

2 に答える 2

2

試してみたいかもしれませんusort。カスタム コールバック関数を指定して配列を並べ替えることができます。アイテムをどの基準でソートしたいかを明確に述べていないため、機能については本当にお手伝いできません. (私の推測ではアルファベット順で逆にHouse_ColourなってRed > Green > Blueいますが、私が見落としていた別の基準がないかどうかはわかりません。)

この単純な比較機能は、指定した順序で家の色によってエントリを並べ替え、実際に必要なものに簡単に変更できます。各色には、自分で割り当てることができるランクがあり (新しい色を簡単に追加することもできます)、else ifパーツの比較演算子を反転することで簡単に順序を変更することもできます。

function cmp($a, $b) {
    $colors = Array('RED' => 3, 'GREEN' => 2, 'BLUE' => 1);
    // A is ranked same as B
    if ($colors[$a['House_Colour']] == $colors[$b['House_Colour']]) {
        return 0;
    }
    // A is ranked above B
    else if ($colors[$a['House_Colour']] > $colors[$b['House_Colour']]) {
        return 1;
    }
    // A is ranked below B
    else {
        return -1;
    }
}

ここで実行例を見ることができます。

于 2012-10-30T22:07:05.230 に答える
1

あなたが何をする必要があるかを理解していれば、usortを使用できます:

usort($array, function($a, $b) {
    $sort = array('Red', 'Green', 'Blue');
    if (array_search($a['House_Colour'], $sort) > array_search($b['House_Colour'], $sort)) return 1;
    if (array_search($a['House_Colour'], $sort) < array_search($b['House_Colour'], $sort)) return -1;
    return 0;
});

家の色の文字列に依存する代わりに、定義を活用できる場合、ソリューションは簡単で効率的になります。

家の色を静的クラスで定義する必要があります (列挙型をシミュレートするため)

Class HouseColour {
    const Red = 0;
    const Green = 1;
    const Blue = 2;
}

この場合、対戦相手/プレイヤーを宣言する必要があります

 $opponent = array ( 'Opponent'=>'Steve', 'House_Colour'=>HouseColour::Green);

クラスと静的定数に慣れていない場合 (利点が非常に大きいため、慣れる必要があります)、一連の定義に頼ることができます。

define ('HC_Red',0);
define ('HC_Green', 1);
define ('HC_Blue', 2);

対戦相手になる

 $opponent = array ( 'Opponent'=>'Steve', 'House_Colour'=>HC_Green);

どちらの場合も、usort 関数は同じです。

usort($array, function($a, $b) {
    if ($a['House_Colour'] > $b['House_Colour']) return 1;
    if ($a['House_Colour'] < $b['House_Colour']) return -1;
    return 0;
});
于 2012-10-30T22:29:57.840 に答える