2017-04-11 62 views
0

我有一个像这样的动态值的数组。目标是具有相同代码和相同代码值的合并数组。Combine Multidimentional数组然后总和值

$array = array(
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'15', 
     ), 
    ), 
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'15', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AC', 
      'name'=>'C Name', 
      'cost'=>'10', 
     ), 
    ), 
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'5', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AC', 
      'name'=>'C Name', 
      'cost'=>'15', 
     ), 
    ), 
); 

,我想造成这样

$result = array(
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'30', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'35', 
     ), 
    ), 
); 

结果是唯一的代码AA和BB,因为代码AC上第一指标不存在。然后将相同的值编码为总和。

由于

+0

你的意思'AC',不'CC' – RomanPerekhrest

回答

2

Demo

$array = array(
      array(
       array(
        'code'=>'AA', 
        'name'=>'A Name', 
        'cost'=>'10', 
       ), 
       array(
        'code'=>'AB', 
        'name'=>'B Name', 
        'cost'=>'15', 
       ), 
      ), 
      array(
       array(
        'code'=>'AA', 
        'name'=>'A Name', 
        'cost'=>'15', 
       ), 
       array(
        'code'=>'AB', 
        'name'=>'B Name', 
        'cost'=>'10', 
       ), 
       array(
        'code'=>'AC', 
        'name'=>'C Name', 
        'cost'=>'10', 
       ), 
      ), 
      array(
       array(
        'code'=>'AA', 
        'name'=>'A Name', 
        'cost'=>'5', 
       ), 
       array(
        'code'=>'AB', 
        'name'=>'B Name', 
        'cost'=>'10', 
       ), 
       array(
        'code'=>'AC', 
        'name'=>'C Name', 
        'cost'=>'15', 
       ), 
      ), 
     );  

     $the_biggest_number=count($array); 

     $new_array = array(); 
     foreach ($array as $key => $val) { 

      foreach ($val as $sub_key => $sub_val) { 
       if(!isset($new_array[$sub_val['code']])){ 
         $sub_val['count']=1; 
         $new_array[$sub_val['code']]=$sub_val; 
       } 
       else{ 
        $new_array[$sub_val['code']]['cost'] += $sub_val['cost']; 
        $new_array[$sub_val['code']]['count'] += 1; 
       } 
      } 
     }   

     $result=array(); 
     foreach ($new_array as $key => $val) { 
      if($val['count']==$the_biggest_number){ 
       unset($val['count']); 
       $result[]=$val; 
      } 
     } 

     $result= array($result); 

     echo '<pre>'; 
     print_r($result); 
+0

好人,很简单 –

0

PHP code demo

<?php 
ini_set("display_errors", 1); 
$array = array(
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'15', 
     ), 
    ), 
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'15', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AC', 
      'name'=>'C Name', 
      'cost'=>'10', 
     ), 
    ), 
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'5', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AC', 
      'name'=>'C Name', 
      'cost'=>'15', 
     ), 
    ), 
); 
$newData=array(); 
array_map(function($arrayData) use(&$newData){ 
    foreach($arrayData as $data => $value) 
    { 
     $newData[]=$value; 
    } 
}, $array); 

$result=array(); 
array_map(function($data) use(&$result){ 
    // array("AA","AB") in this array you can add your code for which you want to merge. 
    if(in_array($data["code"], array("AA","AB"))) 
    { 
     if(!isset($result[$data["code"]])) 
     { 
      $result[$data["code"]]=$data; 
     } 
     else 
     { 
      $result[$data["code"]]["cost"]+=$data["cost"]; 
     } 
    } 

}, $newData); 
$result=array(array_values($result)); 
print_r($result); 

输出:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [code] => AA 
        [name] => A Name 
        [cost] => 30 
       ) 

      [1] => Array 
       (
        [code] => AB 
        [name] => B Name 
        [cost] => 35 
       ) 

     ) 

) 
+0

好人。但如何删除AC? –

+0

@EckoSantoso更改我的帖子 –

+1

@EckoSantoso我已更新我的帖子,您可以检查新代码。它将适用于'AB'和'AA' –

0

修订

<?php 

$collection = array(
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'15', 
     ), 
     array(
      'code'=>'AD', 
      'name'=>'D Name', 
      'cost'=>'45', 
     ), 
    ), 
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'15', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AC', 
      'name'=>'C Name', 
      'cost'=>'10', 
     ), 
    ), 
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'5', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AC', 
      'name'=>'C Name', 
      'cost'=>'15', 
     ), 
    ), 
); 

$newcollection=array(); 
$keysregistered=array(); 
$i=1; 
foreach($collection as $list) { 
    $collectionkeys = array(); 
    foreach($list as $arr) { 
     $key=$arr['code']; 
     $collectionkeys[]=$key; 
     if(isset($keysregistered[$key])) { 
      $oldtotal = $keysregistered[$key]; 
      $total = $oldtotal+$arr['cost']; 
      $newcollection[$key]['cost'] = $total; 
     } else { 
      if($i==1) { 
       $newcollection[$key] = $arr; 
       $keysregistered[$key] = $arr['cost']; 
      } 
     } 
    } 

    $registeredkeys = array_keys($keysregistered); 
    $diff = array_diff($registeredkeys,$collectionkeys); 
    foreach($diff as $delkey) { 
     unset($keysregistered[$delkey],$newcollection[$delkey]); 
    } 
$i++; 
} 

$finalarr = array_values($newcollection); 

print_r($finalarr); 


?> 

现在代码已更新,它甚至会从第一项中删除AD,并为您提供唯一代码的总计。

+0

这不是总成本与相同的代码 –

+0

@EckoSantoso代码更新,比其他答案更好,因为它甚至从$ array的第一个元素中删除AD。你应该试一试 –

0

使用array_columnarray_mapcall_user_func_arrayarray_merge功能的解决方案:

// $arr is your initial array 

$merged = call_user_func_array("array_merge", $arr); 

// getting `code` keys from the first nested item 
$result = array_map(function($v){ 
    return []; 
}, array_column($arr[0], 'cost', 'code')); 

foreach ($merged as $item) { 
    if (isset($result[$item['code']])) { 
     if ($result[$item['code']]) { 
      $result[$item['code']]['cost'] += $item['cost']; 
     } else { 
      $result[$item['code']] = $item; 
     } 
    } 
} 
$result = [array_values($result)]; 

print_r($result); 

输出:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [code] => AA 
        [name] => A Name 
        [cost] => 30 
       ) 

      [1] => Array 
       (
        [code] => AB 
        [name] => B Name 
        [cost] => 35 
       ) 
     ) 
) 
+0

这个不错,但是对于很多php函数来说,这将会在php版本 –

1

其简单,这里是一个办法

<?php 
    $codes = array_column($array[0],"code"); 
    $out =array(); 
    foreach($array as $main) 
    { 
     foreach($main as $sub) 
     { 
      if(in_array($sub['code'], $codes)) 
      { 
       if(isset($out[$sub['code']])) 
       { 
        $out[$sub['code']]['cost']+=$sub['cost']; 
       }else 
       { 
        $out[$sub['code']] = $sub; 
       } 
      }  
     }  
    } 
    print_r(array_values($out)); 
?> 

测试结果

[email protected]:/tmp$ cat test.php 
<?php 
$array = array(
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'15', 
     ), 
    ), 
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'15', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AC', 
      'name'=>'C Name', 
      'cost'=>'10', 
     ), 
    ), 
    array(
     array(
      'code'=>'AA', 
      'name'=>'A Name', 
      'cost'=>'5', 
     ), 
     array(
      'code'=>'AB', 
      'name'=>'B Name', 
      'cost'=>'10', 
     ), 
     array(
      'code'=>'AC', 
      'name'=>'C Name', 
      'cost'=>'15', 
     ), 
    ), 
); 

    $codes = array_column($array[0],"code"); 
    $out =array(); 
    foreach($array as $main) 
    { 
     foreach($main as $sub) 
     { 
      if(in_array($sub['code'], $codes)) 
      { 
       if(isset($out[$sub['code']])) 
       { 
        $out[$sub['code']]['cost']+=$sub['cost']; 
       }else 
       { 
        $out[$sub['code']] = $sub; 
       } 
      }  
     }  
    } 
    print_r(array_values($out)); 
?> 

输出

[email protected]:/tmp$ php test.php 
Array 
(
    [0] => Array 
     (
      [code] => AA 
      [name] => A Name 
      [cost] => 30 
     ) 

    [1] => Array 
     (
      [code] => AB 
      [name] => B Name 
      [cost] => 35 
     ) 

) 
+0

中生效,但是如何使用$ code = array_column($ array [0],“code”);不在第一个索引? 列是dinamic –

+0

@EckoSantoso:我没有得到你,请解释一下,'$ codes = array_column($ array [0],“code”);'将'节点'代码'保存在第一个节点中'$ codes' –