2017-06-01 55 views
-1

使用哪種算法搜索數組中的唯一元素?在數組中搜索唯一元素的算法?

例如數組是:

$arr = [ 
    ["date" => "2015/04/05", 
    "country" => "UK", 
    "number" => 3], 

    ["date" => "2015/04/05", 
    "country" => "UK", 
    "number" => 3], 

    ["date" => "2015/04/05", 
    "country" => "UK", 
    "number" => 3], 

    ["date" => "2015/04/05", 
    "country" => "UK", 
    "number" => 4], 

]; 

所以,我需要算多少具有獨特number元素?

在結果,我應該得到以下結構:

["UK" => array("total" => "2")] 

total是在陣列的獨特number數。

我試着爲:

$output = []; 

foreach ($arr as $k => $value) { 

      $output[ 
       $value[ 
        "country" 
       ]][$value["date"]][$value["number"] 
      ] = true; 
     } 

     foreach ($output as $k => $v) { 

      foreach ($v as $c => $t) { 

       $arr[$k][$c] = count($t); 
      } 
     } 

但這個代碼看起來那麼可怕,隨着循環。此外,我認爲有一個微不足道的算法來解決這些問題。

+2

如果代碼工作,也許這是更適合的代碼審查 – FirstOne

+0

代碼的工作,但我不喜歡它 – Blablacar

+1

我投票關閉(?)這個問題作爲題外話,因爲它更適合在另一個網站,例如https://codereview.stackexchange.com/ – Qirel

回答

2
$arr = [ 
    ["date" => "2015/04/05", "country" => "UK", "number" => 3], 
    ["date" => "2015/04/05", "country" => "UK", "number" => 3], 
    ["date" => "2015/04/05", "country" => "UK", "number" => 3], 
    ["date" => "2015/04/05", "country" => "UK", "number" => 4], 
]; 

$result=array(); 
foreach($arr as $value) 
{ 
    $result[$value["country"]][$value['number']] = 1; 
} 

foreach ($result as $country => $a) { 
    $answer[$country]['total'] = count($a); 
} 

print_r($answer); 

結果:

Array 
(
    [UK] => Array 
     (
      [total] => 2 
     ) 

) 
2

試試這個希望這會幫助你。這裏我們使用foreacharray_uniquearray_map來實現所需的輸出。

Try this code snippet here

$result = array(); 
foreach ($arr as $value) 
{ 
    $result[$value["country"]][] = $value["number"]; 
} 
$result = array_map(function($value){ 
    return array("total"=>count(array_unique($value))); 
}, $result); 
print_r($result) 
+1

實際上並沒有給出所需的答案 – RiggsFolly

4

像這樣的東西會給你所需的輸出。

$array = []; 

foreach (array_unique(array_column($arr, 'country')) as $country) { 
    $filter = array_filter($arr, function ($obj) use ($country) { 
      return $obj['country'] == $country; 
    }); 
    $array[$country] = array("total" => count(array_unique(array_column($filter, 'number')))); 
} 

print_r($array);