2015-11-07 65 views
1

值我有一个这样的数组中的数组:PHP得到大部分重复阵列

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]; 

任何关于修复这个问题?

+0

@jayant这是php。 – tokis

+0

对不起, – jayant

回答

1

“序列化方式” 的出现,从而搜索最多次的夫妇(nameid):

$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 

更新 Without loop

..... 
arsort($out); 

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

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

输出:

A 
120689 
3 
+0

这是迄今为止最好的答案!谢谢!让我问一个问题。如何显示第一个结果而不使用'foreach($ out为$ el => $ count)'?我试图使用echo'$ out [1]'但没有显示。 – tokis

+0

@tokis更新了答案 – voodoo417

1

基于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));}); 
+0

仍然有一个错误“Warning:array_count_values():只能计算STRING和INTEGER的值!” – tokis

+0

对不起,我正在访问数组元素不正确。我已经修复了我的答案,使用'$ x [“name”]' – jayant

+0

您的代码运行良好,但只返回一个结果。 – tokis

1

也许你可以使用此解决方案的工作:

<?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 
+0

它只返回:array(0){} – tokis

+0

哎呀,我忘了添加数组本身。更新了代码。 –

+0

不错!你的代码运作良好!但是,是否也可以在数组中添加“id”对象? – tokis

1

更线性的解决方案。

$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); 
+0

您的代码有效,但在我的实际阵列中不起作用。这是我的实际数组:http://pastebin.com/raw.php?i=Yj1MvTa2 – tokis

+0

有什么区别?我猜名字被定义为一个字符串,并以同样的方式键? –

+0

是的。你是对的!我该如何解决它? – tokis

1

利用了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); 
}); 
0

试试下面的代码。它会给你算的所有元素

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); 
+0

它不是从最高到最低(最重复的价值)排序。 – tokis