2016-04-03 151 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

我认为目前的版本对于你想要完成的事情更加清晰。 –