PHP получает наибольшее значение счетчика из массива

В массиве я должен найти объект, который является наиболее повторяющимся

$items = array("370","370","546","55");
$value = max($items);
$key = array_search($value, $items);

Это распечатать 2 и 546.

Но как я могу вывести 2 и его значение, поэтому в моем примере 370?

0

Решение

Я взял @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);

Ура!

2

Другие решения

я использую 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

2

Вы можете найти тот же счетчик значений, как этот.

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.
1

$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
1

Есть функция 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));
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector