PHP从Array中获取最高计数值

时间:2017-11-01 09:16:26

标签: php arrays sorting

在数组中,我必须找到最常见的对象

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

打印出2和546.

但是如何输出 2 及其相关值,所以在我的示例中 370

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我带了@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)

仅供参考@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],这对我来说很明显)

不要打电话给他,但因为它被接受为答案,我觉得我应该指出这一点。总的来说,虽然我对这个问题采取了合理的态度。所以感谢Kudos。

更新

获得显示超过一次的所有值的一种方法是这样的:

$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 :(得分:1)

您可以像这样找到相同的值。

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.

答案 3 :(得分: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 

答案 4 :(得分:0)

有一个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));