2016-02-20 3 views
0

Я пытаюсь получить элемент победителя из пула элементов внутри массива. Элемент с меньшим количеством вхождений является победителем: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] большую часть времени.

Но если есть несколько элементов, разделяющих одинаковое количество темпов, тот с наименьшим ключом всегда будет выигрывать. В идеале это должно быть рандомизировано.

В этом случае победитель должен быть ответом с ключом 2 или 3, но в настоящий момент ключ 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]; 

Хороший побочный эффект является то, что вы получаете фактический элемент, а не его посчитаем ...

встречаемости
+0

Короткие и эффективные, спасибо – Mazka

Смежные вопросы