1

並べ替えたい次の多次元配列があります。

最も内側の配列をtotal_pointsで並べ替えてから、tiebraker1、2、3で並べ替えたい

例:

Array
(
        [1] => Array
                (
                        [1] => Array
                                (
                                        [userid] => 17
                                        [total_points] => 16
                                        [tiebraker1] => 1
                                        [tiebraker2] => 2
                                        [tiebraker3] => 1
                                )

                        [2] => Array
                                (
                                        [userid] => 29
                                        [total_points] => 16
                                        [tiebraker1] => 1
                                        [tiebraker2] => 2
                                        [tiebraker3] => 9
                                )
                )

        [2] => Array
                (
                        [1] => Array
                                (
                                        [userid] => 26
                                        [total_points] => 26
                                        [tiebraker1] => 2
                                        [tiebraker2] => 2
                                        [tiebraker3] => 4
                                )

                        [2] => Array
                                (
                                        [userid] => 17
                                        [total_points] => 26
                                        [tiebraker1] => 3
                                        [tiebraker2] => 2
                                        [tiebraker3] => 4
                                )
                )
)

結果:

Array
(
        [1] => Array
                (
                        [1] => Array
                                (
                                        [userid] => 29
                                        [total_points] => 16
                                        [tiebraker1] => 1
                                        [tiebraker2] => 2
                                        [tiebraker3] => 9
                                )               
                        [2] => Array
                                (
                                        [userid] => 17
                                        [total_points] => 16
                                        [tiebraker1] => 1
                                        [tiebraker2] => 2
                                        [tiebraker3] => 1
                                )

                )

        [2] => Array
                (
                        [1] => Array
                                (
                                        [userid] => 17
                                        [total_points] => 26
                                        [tiebraker1] => 3
                                        [tiebraker2] => 2
                                        [tiebraker3] => 4
                                )               
                        [2] => Array
                                (
                                        [userid] => 26
                                        [total_points] => 26
                                        [tiebraker1] => 2
                                        [tiebraker2] => 2
                                        [tiebraker3] => 4
                                )


                )
)

array_multisortを使用してみましたが、正しく構成できません。

よろしくお願いします!

4

2 に答える 2

4

使用array_multisortするには、データに別の構造が必要になります。具体的には、「スコアタイプ」でグループ化する必要があります(または数学的に表現すると、配列を転置します)。たとえば、最初の例を使用して次のようにします。

array(5) {
    // $userid
    [0] => array(2) {
        [0] => 17
        [1] => 29
    }

    // $total_points
    [1] => array(2) {
        [0] => 16
        [1] => 16
    }

    // $tiebreaker1
    [2] => array(4) {
        [0] => 1
        [1] => 1
    }

    // $tiebreaker2
    [3] => array(2) {
        [0] => 2
        [1] => 2
    }

    // $tiebreaker3
    [4] => array(2) {
        [0] => 1
        [1] => 9
    }
}

array_multisort()次に、次のように使用できます。

array_multisort($ar[1], SORT_DESC, SORT_NUMERIC,
                $ar[2], SORT_DESC, SORT_NUMERIC,
                $ar[3], SORT_DESC, SORT_NUMERIC,
                $ar[4], SORT_DESC, SORT_NUMERIC,
                $ar[0], SORT_ASC, SORT_NUMERIC);

配列の構造を変更できない場合は、usort()代わりに使用して、比較基準を手動で定義できます。

function cmp($a, $b)
{
    if ($a['total_points'] != $b['total_points']) {
        return ($a['total_points'] > $b['total_points']) ? -1 : 1;
    } elseif ($a['tiebreaker1'] != $b['tiebreaker1']) {
        return ($a['tiebreaker1'] > $b['tiebreaker1']) ? -1 : 1;   
    } elseif ($a['tiebreaker2'] != $b['tiebreaker2']) {
        return ($a['tiebraker2'] > $b['tiebreaker2']) ? -1 : 1;   
    } elseif ($a['tiebreaker3'] != $b['tiebreaker3']) {
        return ($a['tiebreaker3'] > $b['tiebreaker3']) ? -1 : 1;   
    } else {
        return 0;
    }
}

usort($array, "cmp");

免責事項:私の実装がcmp最もエレガントなものであるとは主張しません。しかし、それでうまくいくはずです。:)

于 2012-09-24T08:16:58.147 に答える
0

PHP.netのドキュメントから:

<?php
$ar = array(
       array("10", 11, 100, 100, "a"),
       array(   1,  2, "2",   3,   1)
      );
array_multisort($ar[0], SORT_ASC, SORT_STRING,
                $ar[1], SORT_NUMERIC, SORT_DESC);
var_dump($ar);
?> 

この例では、並べ替え後、最初の配列が「10」、100、100、11、「a」に変換されます(昇順で文字列として並べ替えられました)。2番目には、1、3、 "2"、2、1(番号の降順で並べ替え)が含まれます。

array(2) {
  [0]=> array(5) {
    [0]=> string(2) "10"
    [1]=> int(100)
    [2]=> int(100)
    [3]=> int(11)
    [4]=> string(1) "a"
  }
  [1]=> array(5) {
    [0]=> int(1)
    [1]=> int(3)
    [2]=> string(1) "2"
    [3]=> int(2)
    [4]=> int(1)
  }
}
于 2012-09-24T08:16:24.730 に答える