PHP - 按值Ascending排序然后按值Random

时间:2016-02-20 17:19:13

标签: php arrays sorting

我正在尝试从数组中的元素池中获取获胜元素。具有较少发生率的元素是赢家:

$answer_list = [7,7,7,5,4,1,2,2,3,1,3,7,7,4,1,4,5,5,4,5];
$answer_list_counts = array_count_values($answer_list);
asort($answer_list_counts);

array(6) {
  [2]=> 2
  [3]=> 2
  [1]=> 3
  [4]=> 4
  [5]=> 4
  [7]=> 5
}

排序后,获胜元素大部分时间都是$ answer_list_counts [0]。

但是如果有多个元素共享相同数量的事件,那么具有最低密钥的元素将始终获胜。理想情况下,这应该是随机的。

因此,在这种情况下,获胜者应该是键23的答案,但目前键2总是获胜。尊重初始排序的第二个“随机”排序可以解决这个问题,但是我无法让它起作用。

我试着在asort之后使用shuffle:

$winner = shuffle($answer_list_counts)[0];

但是这个解决方案不尊重第一种,它只是随机地对整个数组进行洗牌。

1 个答案:

答案 0 :(得分:0)

使用array_keys(),您可以在密钥中搜索特定值。所以你可以先减少结果,然后再进行洗牌:

$elementsWithLessOccurences = array_keys($answer_list_counts, $answer_list_counts[0]);
$winner = shuffle($elementsWithLessOccurences)[0];

好的副作用是你得到了实际的元素,而不是它的出现次数...