2016-04-03 7 views
0

私はまずRankで数量で並べ替えようとしていますが、数量が等しければRankで数値順にソートしようとしています。PHP多項式配列をキー内の値の出現数でソート

それはここに複雑に聞こえるかもしれませんが、私はランクで繰り返される値の数によって

  1. まずソート配列を想定擬似コードです。
  2. 繰り返し値の数がRankの値で数値的にソートされる場合は、

2番目の部分が再帰的に見えるのは、すべてのサブアレイで実行されると思います。

私はusortを試してきましたが、私はそれを得ることができませんので、配列の繰り返しのランク値の数を見てください。マルチソートはどちらにも合わないようです。

例:

 
Array 
(
    [0] => Array 
     (
      [Rank] => 7 
      [Suit] => Hearts 
     ) 

    [1] => Array 
     (
      [Rank] => 3 
      [Suit] => Hearts 
     ) 

    [2] => Array 
     (
      [Rank] => 6 
      [Suit] => Spades 
     ) 

    [3] => Array 
     (
      [Rank] => 10 
      [Suit] => Spades 
     ) 

    [4] => Array 
     (
      [Rank] => 3 
      [Suit] => Spades 
     ) 

    [5] => Array 
     (
      [Rank] => 6 
      [Suit] => Hearts 
     ) 

    [6] => Array 
     (
      [Rank] => 2 
      [Suit] => Clubs 
     ) 

) 

私のアルゴリズム

 
Array 
(

    [0] => Array 
     (
      [Rank] => 6 
      [Suit] => Hearts 
     ) 

    [1] => Array 
     (
      [Rank] => 6 
      [Suit] => Spades 
     ) 

    [2] => Array 
     (
      [Rank] => 3 
      [Suit] => Spades 
     ) 


    [3] => Array 
     (
      [Rank] => 3 
      [Suit] => Hearts 
     ) 

    [4] => Array 
     (
      [Rank] => 10 
      [Suit] => Spades 
     ) 

    [5] => Array 
     (
      [Rank] => 7 
      [Suit] => Hearts 
     ) 

    [6] => Array 
     (
      [Rank] => 2 
      [Suit] => Clubs 
     ) 

) 

答えて

1

によると、私が思い付くことができ、最も簡単な解決策は、私たちはそれぞれのカードの数を格納しますこれで二番目の配列を使用することですランク。この配列をソート関数に渡して、必要な結果を得ることができます。ここで

が、これがどのように見えるかの例です:

$cards = [...]; 

$ranks = []; 

// Count the cards for each rank 
foreach ($cards as $card) { 
    if (!isset($ranks[$card['Rank']])) { 
     $ranks[$card['Rank']] = 0; 
    } 

    $ranks[$card['Rank']]++; 
} 

// Sort the cards array 
usort($cards, function ($a, $b) use ($ranks) { 
    // If the cards count is the same for the rank, compare rank 
    if ($ranks[$a['Rank']] == $ranks[$b['Rank']]) { 
     return $a['Rank'] - $b['Rank']; 
    } 

    // Compare the card count for the rank 
    return $ranks[$a['Rank']] - $ranks[$b['Rank']]; 
}); 
+0

は、私は2番目でそれをテストします、返信いただきありがとうございますが、私はあなたが最後にスーツでソートされている理由としてわからないのですか? – user3786992

+0

ああ、申し訳ありませんが、あなたもそうしたいと思っていました。私は簡単なバージョンを思いついた、私は2番目に私の答えを編集します。 –

+0

私は現在のバージョンがあなたが達成しようとしているもののはるかに明確だと思います。 –

関連する問題