PHP で多次元配列の項目を複数使用して SQL の ORDER BY のようにソートする方法です。

$answer =
  array(
    "category1" =>
       array(
         "ans1" => 1,
         "ans2" => 1,
         "ans3" => 1
       ),
    "category2" =>
       array(
         "ans1" => 1,
         "ans2" => 2,
         "ans3" => 0
       ),
    "category3" =>
       array(
         "ans1" => 0,
         "ans2" => 2,
         "ans3" => 1,
       ),
  );

というような配列を下記条件でソートします。

  • ans1 の多い順
  • ans1 が同じ場合は ans2 の多い順
  • ans2 が同じ場合は ans3 の多い順

PHP の uasort 関数を使用します。
この関数はユーザーが比較関数を定義でき、その関数を使用して連想インデックスを保持したまま配列をソートします。

uasort($answer, "compare");

function compare($a, $b) {
    foreach ($a as $k=>$v) {
        if ($a[$k] > $b[$k]) {
            return -1;
        } else if ($a[$k] < $b[$k]) {
            return 1;
        }
    }
}

上記の関数を使用してソートした結果 $answer は下記のようになりました。

$answer =
  array(
    "category2" =>
       array(
         "ans1" => 1,
         "ans2" => 2,
         "ans3" => 0
       ),
    "category1" =>
       array(
         "ans1" => 1,
         "ans2" => 1,
         "ans3" => 1
       ),
    "category3" =>
       array(
         "ans1" => 0,
         "ans2" => 2,
         "ans3" => 1,
       ),
  );

関連する投稿