【问题标题】:PHP Get most repeated value in ArrayPHP获取数组中重复次数最多的值
【发布时间】:2016-02-08 11:05:53
【问题描述】:

我在这样的数组中有一个数组:

Array
(
    [0] => Array
        (
            [name] => B
            [id] => 924572
        )

    [1] => Array
        (
            [name] => A
            [id] => 120689
        )

    [2] => Array
        (
            [name] => A 
            [id] => 120689
        )

    [3] => Array
        (
            [name] => C
            [id] => 919644
        )

    [4] => Array
        (
            [name] => A
            [id] => 120689
        )

    [5] => Array
        (
            [name] => B
            [id] => 924572
        )
)

如何从名为 nameid 的对象中获取重复次数最多的值?

我已经尝试过下面的代码,但出现错误:Warning: array_count_values(): Can only count STRING and INTEGER values!

$count = array_count_values($info);
arsort($count);
$popular = array_keys($count);
echo $popular[0];

关于这个问题的任何修复?

【问题讨论】:

  • @jayant 这是 php。

标签: php arrays


【解决方案1】:

搜索最多重复情侣的“序列化方式”(name,id):

$out = array();
foreach($arr as $el){
   $key = serialize($el);
   if (!isset($out[$key]))
       $out[$key]=1;
   else
       $out[$key]++;
}

arsort($out);

foreach($out as $el=>$count){
   $item = unserialize($el);
   echo "Name = ".$item['name'].' ID = '.$item['id'].' Count = '.$count.'<br/>';
}

输出:

Name = A ID = 120689 Count = 3
Name = B ID = 924572 Count = 2
Name = C ID = 919644 Count = 1

更新无循环

.....
arsort($out);

$most  = unserialize(key($out));
$most_count = array_shift($out);

echo $most['name'];
echo $most['id'];
echo $most_count;

输出:

A
120689
3

【讨论】:

  • 这是迄今为止最好的答案!谢谢!让我问一个问题。如何在不使用foreach($out as $el=&gt;$count) 的情况下显示第一个结果?我尝试使用 echo $out[1] 但没有显示任何内容。
【解决方案2】:

更线性的解决方案。

$arr = Array
(
    Array
        (
            "name" => "B",
            "id" => 924572
        ),

    Array
        (
            "name" => "A",
            "id" => 120689
        ),

    Array
        (
            "name" => "A" ,
            "id" => 120689
        ),

    Array
        (
            "name" => "C",
            "id" => 919644
        ),

    Array
        (
            "name" => "A",
            "id" => 120689
        ),

    Array
        (
            "name" => "B",
            "id" => 924572
        ));

$countArr = Array();

for($i = 0; $i < count($arr); $i++)
{
    $tmpArr = $arr[$i];

    if(array_key_exists($tmpArr["name"],$countArr))
        $countArr[$tmpArr["name"]]++;
    else
        $countArr[$tmpArr["name"]] = 0;
}

arsort($countArr);
var_dump($countArr);

【讨论】:

  • 您的代码有效,但在我的实际数组中它不起作用。这是我的实际数组:pastebin.com/raw.php?i=Yj1MvTa2
  • 和有什么区别?我猜名称是用相同的方式定义的字符串和键?
  • 那么它应该可以工作,你在我的代码上遇到什么错误?
  • 对不起。您的代码确实有效。谢谢!但是是否也可以在数组中添加“id”对象?
  • 您希望将 id 添加到排序的计数结果中吗?
【解决方案3】:

也许你可以使用这个解决方案:

<?php
$info = array(
    array(
        "name" => "B",
        "id" => 924572
    ),
    array(
        "name" => "A",
        "id" => 120689
    ),
    array(
        "name" => "A",
        "id" => 120689
    ),
    array(
        "name" => "C",
        "id" => 919644
    ),
    array(
        "name" => "A",
        "id" => 120689
    ),
    array(
        "name" => "B",
        "id" => 924572
    ),
);

$result = array();
foreach ($info as $infoKey => $infoValue) {
    foreach ($infoValue as $itemKey => $itemValue) {
        if ($itemKey != "name") {
            continue;
        }
        if (array_key_exists($itemValue, $result)){
            $result[$itemValue]++;
            continue;
        }
        $result[$itemValue] = 1;
    }
}
arsort($result);
var_dump($result);

将导致:

array (size=3)
  'A' => int 3
  'B' => int 2
  'C' => int 1

【讨论】:

  • 它只返回:array(0) { }
  • 哎呀,我忘了添加数组本身。更新了代码。
  • 不错!您的代码运行良好!但是是否也可以在数组中添加“id”对象?
【解决方案4】:

基于 PHP 中的 finding the modemapping。这行得通吗?

$name_array = array_map(function($x) {return $x["name"];}, $info);
$count = array_count_values($name_array);
$mode = array_keys($count, max($count));

要返回"name""id" 对的数组,请使用:

$return_value = array_filter($info, function($x) use ($mode) { return (in_array($x["name"], $mode));});

【讨论】:

  • 还有一个错误“警告:array_count_values(): Can only count STRING and INTEGER values!”
  • 抱歉,我错误地访问了数组元素。我已将我的答案固定为使用$x["name"]
  • @tokis 是的。更新了我的答案以返回所有值
  • 太棒了!谢谢!但是是否也可以在数组中添加“id”对象?
  • @tokis 使用 array_filterin_array 在我的回答中更新
【解决方案5】:

使用array_column(需要PHP 5.5 或shim)。

$count_values = array_count_values(array_column($array, 'name'));

$most_frequent_name = array_search(max($count_values), $count_values);


然后,如果您想要所有具有此名称的数组:

$items = array_filter($array, function ($v) use ($most_frequent_name) {
    return $v['name'] == $most_frequent_name;
});


如果多个名称可能具有相同的最高频率:

$count_values = array_count_values(array_column($array, 'name'));

$most_frequent_names = array_keys($count_values, max($count_values));

$items = array_filter($array, function ($v) use ($most_frequent_names) {
    return in_array($v['name'], $most_frequent_names);
});

【讨论】:

    【解决方案6】:

    试试下面的代码。它会给你计算所有元素的出现次数

    function array_icount_values($arr,$lower=true) { 
         $arr2=array(); 
         if(!is_array($arr['0'])){$arr=array($arr);} 
         foreach($arr as $k=> $v){ 
          foreach($v as $v2){ 
          if($lower==true) {$v2=strtolower($v2);} 
          if(!isset($arr2[$v2])){ 
              $arr2[$v2]=1; 
          }else{ 
               $arr2[$v2]++; 
               } 
        } 
        } 
        return $arr2; 
    } 
    
    $arr = array_icount_values($array);
    echo "<pre>";
    print_r($arr);
    

    【讨论】:

    • 不是从高到低排序(重复次数最多的值)。
    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多