2017-06-01 102 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);