2016-04-03 3 views
0

Я пытаюсь сначала отсортировать по количеству в ранге, а если количество равно, то сортировать по количеству по рангу.PHP Сортировка Многомерный массив по количеству вхождений значений в ключ

Это может показаться сложным, но вот псевдокод я себе

  1. сортировать массивы по количеству повторных значений в ранге.
  2. Если количество повторяющихся значений равно количеству, равному количеству в ранге.

Я предполагаю, что его рекурсивное видение рассматривается как вторая часть выполняется на всех подматрицах.

Я пробовал использовать, но я не могу получить его, чтобы увидеть количество повторных значений ранга в массиве. Кажется, что многозадачность не подходит.

Пример:

 
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

Я думаю, что текущая версия намного более понятна для того, что вы пытаетесь выполнить. –