2014-11-06 114 views
1

我有多維數組:多重陣列計數值

$array = array(
array(
"id" => 1, 
"value" => 100 
), 
array(
"id" => 1, 
"value" => 200 
), 
array(
"id" => 1, 
"value" => 300 
), 
array(
"id" => 2, 
"value" => 2 
), 
array(
"id" => 2, 
"value" => 5 
), 
array(
"id" => 3, 
"value" => 10.50 
), 
); 

我需要得到新的多維數組,像這樣:

$newArray = array(
array(
"id" => "1", 
"sum_of_values" => 600 
), 
array(
"id" => 2, 
"sum_of_values" => 7 
), 
array(
"id" => 3, 
"sum_of_values" => 10.50 
), 
); 

我的意思是,關鍵[ sum_of_values]應該使用相同的鍵[id]對子數組中的值進行計數。

我已經試過這樣:

$cnt = count($array); 

      $finalArray = array(); 
      $tempArray = array(); 
      for($i = 0; $i < $cnt; $i++){ 
       if($array[$i]["id"] == $array[$i++]["id"]){ 

        $search = $array[$i]["id"]; 
        $column = "value"; 

        $sum = array_sum(
            array_map(
             function($data) use ($column) { 
              return $data[$column]; 
             }, 
            array_filter(
             $array, 
             function($data) use ($search) { 
              return fnmatch($search, $data["id"]); 
             } 
            ) 
            ) 
        ); 

        $tempArray = array(
         "id" => $array[$i]["id"], 
         "sum_of_values" => $sum 
         ); 

        $finalArray[] = $tempArray; 

        } else { 
         $tempArray = array(
          "id" => $array[$i]["id"], 
          "sum_of_values" => $array[$i]["value"] 
          ); 
         } 
      } 

和它的作品,它計數與同一[ID]子陣列的值。但問題是沒有返回子數組,它的key [id]沒有相同的例子。在我的情況下 - 具有[id] = 3的子數組不會返回。此外,[id] = 1和[id] = 2的子數組將重複[n-n/2]次。

我認爲,這個問題是在使用週期 - for ($i = 0; $i < $cnt; $i++)和條件if ($array[$i]["id"] == $array[$i++]["id"]),因爲它看起來很愚蠢,但我找不到其他東西。

回答

3

你的功能似乎太複雜了。這個怎麼樣?

$result = array(); 
foreach ($array as $item) { 
    if (!empty($result[$item['id']])) 
     $result[$item['id']]['sum_of_values'] += $item['value']; 
    else 
     $result[$item['id']] = array(
      'id' => $item['id'], 
      'sum_of_values' => $item['value'] 
     ); 
} 

如果你print_r($result)

Array 
(
    [1] => Array 
     (
      [id] => 1 
      [sum_of_values] => 600 
     ) 

    [2] => Array 
     (
      [id] => 2 
      [sum_of_values] => 7 
     ) 

    [3] => Array 
     (
      [id] => 3 
      [sum_of_values] => 10.5 
     ) 

) 
+0

這正是我所需要的!感謝幫助。需要爲未來分析這個例子 – 2014-11-06 14:45:12

1

就像一種替代方案:這是array_reduce()保姆:

$totals = array_reduce($array, function($reduction, $current){ 
    $id = $current["id"]; 
    if (empty($reduction[$id])){ 
     $reduction[$id] = ["id"=>$id, "sum_of_values"=>0]; 
    } 
    $reduction[$id]["sum_of_values"] += $current["value"]; 
    return $reduction; 
}, []); 

我更喜歡這種方法一般循環/處理:我認爲它有點乾淨。但里程不同,顯然。