2016-04-03 57 views
0

我試圖先按Rank中的數量排序,如果數量相等,則按秩排序數字排序。PHP排序按鍵中值的出現次數排列多維數組

這聽起來很複雜,但這裏是僞代碼,我在反覆等級值的數目設想

  1. 首先排序數組。
  2. 如果重複值的數量等於Rank中的值,則按數值排序。

我想它的有點遞歸看到作爲第二部分是在所有的子陣列上執行。

我一直在嘗試使用usort,但是我無法得到它,因此請查看數組中重複的rank值的計數。 Multisort似乎也不適合。

例子:

 
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

謝謝你的回覆,我會在第二個測試,但我不能確定,爲什麼你被起訴末排序? – user3786992

+0

對不起,我以爲你也想這樣做。我想出了一個更簡單的版本,我會在一秒之內編輯我的答案。 –

+0

我認爲目前的版本對於你想要完成的事情更加清晰。 –