1

私はこの配列を持っていますが、これはすでに'name'ASCでソートされています。

array 
  0 => 
    array
      'id' => '4'
      'name' => 'iPad'
      'games' => 5
  1 => 
    array
      'id' => '5'
      'name' => 'iPhone'
      'games' => 5
  2 => 
    array
      'id' => '6'
      'name' => 'Nintendo DS'
      'games' => 5
  3 => 
    array
      'id' => '1'
      'name' => 'Playstation 2'
      'games' => 2
  4 => 
    array
      'id' => '7'
      'name' => 'Playstation 3'
      'games' => 2
  5 => 
    array
      'id' => '7'
      'name' => 'Xbox 360'
      'games' => 1

'games'の値が同じである場合、ソートされた'name'の順序を尊重しながら、'games'の値でソートしたかったのです。

結果は次のようになります。

array
  0 => 
    array
      'id' => '7'
      'name' => 'Xbox 360'
      'games' => 1
  1 => 
    array
      'id' => '1'
      'name' => 'Playstation 2'
      'games' => 2
  2 => 
    array
      'id' => '7'
      'name' => 'Playstation 3'
      'games' => 2
  3 => 
    array
      'id' => '4'
      'name' => 'iPad'
      'games' => 5
  4 => 
    array
      'id' => '5'
      'name' => 'iPhone'
      'games' => 5
  5 => 
    array
      'id' => '6'
      'name' => 'iPod Touch'
      'games' => 5

ほぼすべての並べ替え関数とユーザー定義の比較関数を試しましたが、適切なものが見つかりませんでした。

可能であれば、ゲームの価値が同じである場合に、ソートされた「名前」ASCを維持しながら、「ゲーム」DESCが必要な場合、どのようにアプローチできますか?例:

array
  0 => 
    array
      'id' => '6'
      'name' => 'Nintendo DS'
      'games' => 5
  1 => 
    array
      'id' => '5'
      'name' => 'iPhone'
      'games' => 5
  2 => 
    array
      'id' => '4'
      'name' => 'iPad'
      'games' => 5
  3 => 
    array
      'id' => '1'
      'name' => 'Playstation 2'
      'games' => 2
  4 => 
    array
      'id' => '7'
      'name' => 'Playstation 3'
      'games' => 2
  5 => 
    array
      'id' => '7'
      'name' => 'Xbox 360'
      'games' => 1
4

2 に答える 2

2
usort($array, function ($a, $b) {
    if ($a['games'] == $b['games']) {
        return strcmp($a['name'], $b['name']);
    } else {
        return $a['games'] - $b['games'];
    }
});
于 2012-04-18T01:41:11.617 に答える
0

カスタム比較関数を使用する他のアプローチもありますが、最も簡単なアプローチはを使用することarray_multisortです。

まず、配列を並べ替えるキーを使用して配列を作成します。次に、これらの配列に並べ替えパラメーターをに指定しarray_multisortます。

// first collect the sorting keys
// ensure that $thearray[$n]['key'] corresponds to $sortkey[$n]
$games = array();
$name = array();
foreach ($thearray as $item) {
    $games = $item['games'];
    $name = $item['name'];
}

// now sort
array_multisort($games, SORT_NUMERIC, SORT_ASC,
                $name, SORT_STRING, SORT_ASC,
                $thearray);
// $thearray is now sorted first by games, then by name.
于 2012-04-18T01:45:58.017 に答える