2015-11-07 67 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