2016-02-20 29 views
0

我試圖從數組內的元素池中獲得一個優勝元素。有不太ocurrences元素是贏家:PHP - 按值升序然後按值隨機

$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後洗牌:

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

但這種方法不尊重第一個排序,它只是慢騰騰整個陣列隨機。

+1

你能張貼不代碼工作? – martin

+0

加入了全部代碼 – Mazka

回答

0

array_keys()您可以搜索關鍵字的特定值。所以,你可以先減少的結果,然後執行洗牌:

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

很好的副作用是,你得到的實際元素,而不是它的occurence個性化......

+0

短而有效,謝謝 – Mazka