В массиве я должен найти объект, который является наиболее повторяющимся
$items = array("370","370","546","55");
$value = max($items);
$key = array_search($value, $items);
Это распечатать 2 и 546.
Но как я могу вывести 2 и его значение, поэтому в моем примере 370?
Я взял @alistaircol Idea и не только исправил ее (поскольку она зависит от порядка массива), но и упростил часть назначения, чтобы мы не создавали 2 новых массива
Вы можете попробовать это здесь
http://sandbox.onlinephpfunctions.com/code/2fe11fb6040dc68db43fb5cbb858ef3e47394dd2
И вот код
$items = [370,370,546,55,55,55];
$counted = array_count_values($items);
arsort($counted); //sort descending maintain keys
$occurences = reset($counted); //get the first value (rewinds internal pointer )
$most_frequent = key($counted); //get the key, as we are rewound it's the first key
echo $most_frequent . ' appears ' . $occurences . ' time(s)' . PHP_EOL;
Это правильно выводит
55 appears 3 time(s)
Просто FYI @alistaircol оригинальный ответ провалит этот тест
http://sandbox.onlinephpfunctions.com/code/fe13e7a0bd00ea1219bc69e2bc5a5aebaf478034
Который меняет входной массив с:
$items = [370,370,546,55];
Для того, чтобы:
$items = [370,370,546,55,55,55];
Это все равно выведет:
370 appears 2 time(s)
В этом случае, когда правильный ответ 55 appears 3 time(s)
Таким образом, элемент с наибольшим является последним, который показывает, что он основан на порядке (что было очевидно для меня из-за использования первого индекса [0]
)
Не для того, чтобы вызвать его, но, поскольку это было принято как ответ, я чувствовал, что должен указать на это. В целом, хотя у меня был здравый подход к вопросу. Так что Слава об этом.
ОБНОВИТЬ
Один из способов получить все значения, которые отображаются более одного раза, выглядит следующим образом:
$items = [370,370,546,55,55,55];
$unique = array_unique( $items );
$diff = array_diff_assoc( $items, $unique);
print_r( $diff );
Какие выводы
Array
(
[1] => 370
[4] => 55
[5] => 55
)
Вы можете проверить это здесь http://sandbox.onlinephpfunctions.com/code/53df6a8ea7a68768572cfef494e3b715aa13e83b
Одно замечание: вы получите ровно на один случай меньше, чем на самом деле.
Update1
Мы можем легко объединить их и объяснить недостающий. Посмотрите эту скрипку, чтобы проверить это
http://sandbox.onlinephpfunctions.com/code/1bc1a30a5e091af3a18fec2c8b48050869108549
И код:
$items = [370,370,546,55,55,55];
$unique = array_unique( $items );
$diff = array_diff_assoc( $items, $unique);
print_r( $diff );
echo "\n\n";
$counted = array_count_values($diff);
arsort($counted); //sort descending maintain keys
$occurences = reset($counted); //get the first value (rewinds internal pointer )
$most_frequent = key($counted); //get the key, as we are rewound it's the first key
echo $most_frequent . ' appears ' . ( $occurences + 1 ) . ' time(s)' . PHP_EOL;
Выходы (оба предыдущих)
Array
(
[1] => 370
[4] => 55
[5] => 55
)
55 appears 3 time(s)
О, и если вы хотите, чтобы в списке были больше одного, без дубликатов, просто нажмите еще раз с уникальным массивом $unique = array_unique($diff);
Ура!
я использую array_count_values
и из полученного массива использовать array_keys
чтобы получить числа, которые появляются больше всего (например, 370) и array_values
чтобы узнать, сколько раз он появляется (например, 2).
<?php
$items = [370,370,546,55];
$counted = array_count_values($items);
/*
Array
(
[370] => 2
[546] => 1
[55] => 1
)
*/
$number_appears_most = array_keys($counted);
/*
Array
(
[0] => 370
[1] => 546
[2] => 55
)
*/
$number_of_occurences = array_values($counted);
/*
Array
(
[0] => 2
[1] => 1
[2] => 1
)
*/
echo $number_appears_most[0] . ' appears ' . $number_of_occurences[0] . ' time(s)' . PHP_EOL;
Это даст вам:
370 appears 2 time(s)
Демо-версия: https://eval.in/890626
Вы можете найти тот же счетчик значений, как этот.
print_r(array_count_values($items));
будет выводить
Array
(
[370] => 2
[546] => 1
[55] => 1
etc...
)
Чтобы получить значение 2 и 307, вы должны сделать следующее.
$new_arr = array_count_values($items);
$max = max($new_arr);
$new_arr = array_keys($new_arr, max($new_arr)));
echo $new_arr[0]."is repeated (".$max.") times.";
будет выводить
307 is repeated (2) times.
$items = [370,370,546,55,55];
$counted = array_count_values($items); // count occurrences
$counted=array_intersect ($counted,[max($counted)]); // only keep elements with highest occurrence
var_export ($counted); // print to screen
Есть функция php array_count_values
это должно работать в вашем случае.
Затем у вас есть массив с подсчетом всех значений, и вы можете сортировать и работать с ними.
https://secure.php.net/manual/en/function.array-count-values.php
$items = array("370","370","546","55");
print_r(array_count_values($items));