2013-04-23 134 views
1

我有一個多維數組,我需要總結具有相同鍵的值。
的print_r($輸入)
多維數組中具有相同鍵值的總和值

Array 
(
    [0] => Array 
     (
      [id] => colors 
      [power] => Array 
       (
        [green] => 12 
        [red] => 5 
        [orange] => 9 
        [black] => 6 
        [white] => 5 
        [blue] => 11 
       ) 

     ) 

    [1] => Array 
     (
      [id] => colors 
      [power] => Array 
       (
        [green] => 20 
        [red] => 40 
        [orange] => 80 
        [black] => 60 
        [white] => 100 
        [blue] => 110 
       ) 

     ) 
    [2] => Array 
     (
      [id] => glossycolor 
      [power] => Array 
       (
        [green] => 20 
        [red] => 40 
        [orange] => 80 
        [black] => 60 
        [white] => 100 
        [blue] => 110 
       ) 

     ) 

) 

我需要的結果是象

Array 
(
    [0] => Array 
     (
      [id] => colors 
      [power] => Array 
       (
        [green] => 32 
        [red] => 45 
        [orange] => 89 
        [black] => 66 
        [white] => 105 
        [blue] => 121 
       ) 

     ) 

    [1] => Array 
     (
      [id] => glossycolor 
      [power] => Array 
       (
        [green] => 20 
        [red] => 40 
        [orange] => 80 
        [black] => 60 
        [white] => 100 
        [blue] => 110 
       ) 

     ) 

) 

我試圖用array_shift到的值進行排序,並求和子陣列的值,但我失敗

$finalRate = array_shift($inputs); 
       foreach ($inputs as $val) { 
        foreach ($val as $key => $val) { 
         $finalRate[$key] += $val; 
        } 
       } 

但失敗並返回空數組。

回答

1

假設你的數組總是具有相同的結構我會去用:

$outcome = array(); 
foreach ($colors as $array) { 
    $id = $array['id']; 

    if (array_key_exists($id, $outcome)) { 
     foreach ($array['power'] as $color => $value) { 
      $outcome[$id]['power'][$color] += $value; 
     } 
     continue; 
    } 
    $outcome[$array['id']] = $array; 
} 
array_values($outcome); 
1
$array1 = array_slice($input,0,1); //slicing first value of $input i.e Array([0]=>array) 
$array2 = array_slice($input,1,1); //slicing second value of $input i.e Array([1]=>array) 
$array = array_sum_values($array1,$array2); //summing values of two arrays 
$input = array_splice($input,0,2,$array) //Removing [0] and [1] from $input and replacing with $array. 

請參考PHP手冊瞭解更多詳情。

0

這可能是不是要對這個最有效的方法..但它的工作原理,是很容易實現:

$arr = array(
    0 => array(
     'id' => 'colors', 
     'power' => array(
      'green' => 12, 
      'red' => 5, 
      'orange' => 9, 
      'black' => 6, 
      'white' => 5, 
      'blue' => 11, 
     ), 
    ), 
    1 => array(
     'id' => 'colors', 
     'power' => array(
      'green' => 20, 
      'red' => 40, 
      'orange' => 80, 
      'black' => 60, 
      'white' => 100, 
      'blue' => 110, 
     ), 
    ), 
    2 => array(
     'id' => 'glossycolors', 
     'power' => array(
      'green' => 20, 
      'red' => 40, 
      'orange' => 80, 
      'black' => 60, 
      'white' => 100, 
      'blue' => 110, 
     ), 
    ), 
); 

foreach ($arr as $k1 => $v1) { 
    foreach ($arr as $k2 => $v2) { 
     if ($k1 === $k2) continue; 
     if (! isset($arr[ $k1 ]) || ! isset($arr[ $k2 ])) continue; 
     if ($v1['id'] === $v2['id']) { 
      foreach ($v2['power'] as $power_k => $power_v) { 
       $arr[$k1]['power'][$power_k] += $power_v; 
      } 
      unset($arr[$k2]); 
     } 
    } 
} 

print_r($arr); 

,這導致:

Array 
(
    [0] => Array 
     (
      [id] => colors 
      [power] => Array 
       (
        [green] => 32 
        [red] => 45 
        [orange] => 89 
        [black] => 66 
        [white] => 105 
        [blue] => 121 
       ) 

     ) 

    [2] => Array 
     (
      [id] => glossycolors 
      [power] => Array 
       (
        [green] => 20 
        [red] => 40 
        [orange] => 80 
        [black] => 60 
        [white] => 100 
        [blue] => 110 
       ) 

     ) 

) 

因此,基本上,它遍歷同一陣列T wice並且將常見'id'元素的值相加,然後從陣列中移除第二個副本,只剩下原始數據和後面的數據。歡呼聲