2013-04-23 139 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'元素的值相加,然后从阵列中移除第二个副本,只剩下原始数据和后面的数据。欢呼声