🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # **合并** ## **合并多维数组中的子数组** ~~~php $a=[[1,2,3,4],['a','b','c','d']]; $merged = call_user_func_array('array_merge', $a); var_export($merged);//array ( 0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 'a', 5 => 'b', 6 => 'c', 7 => 'd', ) ~~~ 如果是 PHP 版本在 5.6 以上,可以使用 `...` 操作符: ~~~php $merged = array_merge(...$result); ~~~ ## **三个维度的数据合并(将数组同一下标的列集合为一个新数组)** ~~~ //三个维度的数据合并 $names = array('zhangsan', 'lisi', 'wangwu'); $sex = array("man", "sex", "man"); $age = array(20, 25, 28); $users = array_map(null, $names, $sex, $age); print_r($users); //输出结果如下: Array ( [0] => Array ( [0] => zhangsan [1] => 20 [2] => man ) [1] => Array ( [0] => lisi [1] => 25 [2] => sex ) [2] => Array ( [0] => wangwu [1] => 28 [2] => man ) ) $a=[ 'jan' => "15.00", 'feb' => "5.00", 'may' => "5.00", ]; $b=[ 'jan' => "15.00", 'feb' => "5.00", 'may' => "5.00", ]; $data = array_map(null, $a,$b); 结果: [ ["15.00","15.00"], ["5.00","5.00"], ["5.00","5.00"] ] ~~~ # **合并求和** ## 行求和 array_sum(一维数组) ``` $a=array(0=>5,1=>"15s",2=>25); echo array_sum($a); //45 ``` ## 列求和1 ``` $arr1=[ ['feb'=>5,'dec'=>5,total=>10], ['feb'=>10,'dec'=>10,total=>20], ]; $feb_total= array_sum(array_column($arr, 'feb')); ``` ## 列求和2 ``` $arr=[ ['id'=>1,'name'=>'dash','money'=>100,'cost'=>50], ['id'=>2,'name'=>'tom','money'=>100,'cost'=>50], ['id'=>3,'name'=>'dash','money'=>100,'cost'=>50], ]; function sum($arr) { return array_sum(array_map(function ($val) { return $val['cost']; }, $arr)); } $data=sum($arr);//150 ``` ## 列求和3 多个一维数组合并为一个一维数组 与 array\_merge() 函数之间的不同是有相同的键名时,array\_merge\_recursive() 不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组 ``` //多个一维数组相同key的值相加合并 $array1 = [a => '501', b => '1']; $array2 = [a => '501', b => '2']; $array3 = [a => '505', b => '1']; $array4 = [a => '509', b => '1']; $merged = array_merge_recursive($array1, $array2, $array3, $array4); //var_export($merged);//['a'=>[501,501,505,509],'b'=>[501,501,505,509]] $summed = array_map(function($item) { return array_sum((array) $item); }, $merged); var_export($summed);//[a=>'2016','b'=>5] ``` ## 列求和4 二维数组多条数据 相加合并 为一条数据 ``` $arr=[ ['a' => '501', 'b' => '1'], ['a' => '501', 'b' => '2'], ['a' => '505', 'b'=> '1'], ['a' => '509', 'b' => '1'] ]; //注意:$arr必须有一条数据,否则会报错 if (empty($arr)) { $arr=[["a" => "0"],'b' => '0']]; } $merged = array_merge_recursive(...$arr); //var_export($merged);//['a'=>[501,501,505,509],'b'=>[501,501,505,509]] $summed = array_map(function($item) { return array_sum((array) $item); }, $merged); var_export($summed);//[a=>'2016','b'=>5] ``` 两个二维数组的合并列求和 ``` //已知 $arr1=[ ['feb'=>5,'dec'=>5,total=>10], ['feb'=>10,'dec'=>10,total=>20], ]; $arr2=[ ['feb'=>5,'dec'=>5,total=>10], ['feb'=>10,'dec'=>10,total=>20], ]; //求合并后这样的数据 $arr2=[ ['feb'=>10,'dec'=>10,total=>20], ['feb'=>20,'dec'=>20,total=>40], ]; //具体 $arr=array_map(function($v1,$v2){ $merged = array_merge_recursive($v1,$v2); $summed = array_map(function($item) { return array_sum((array) $item); }, $merged); return $summed; },$arr1,$arr2); //升级版解决两个数组长度不一样导致的错误 $arr1=[ ['feb'=>5,'dec'=>5,'total'=>10], ['feb'=>10,'dec'=>10,'total'=>20], ['feb'=>15,'dec'=>15,'total'=>30], ]; $arr2=[ ['feb'=>5,'dec'=>5,'total'=>10], ['feb'=>10,'dec'=>10,'total'=>20], ]; //求合并后这样的数据 [ ['feb'=>10,'dec'=>10,'total'=>20], ['feb'=>20,'dec'=>20,'total'=>40], ]; $arr=array_map(function($v1,$v2){ if ($v1!=NULL && $v2!=NULL) { $merged = array_merge_recursive($v1,$v2); $summed = array_map(function($item) { return array_sum((array) $item); }, $merged); return $summed; }else{ return $v1=NULL?$v2:$v1; } },$arr1,$arr2); var_export($arr); //结果 [ ['feb'=>10,'dec'=>10,'total'=>20], ['feb'=>20,'dec'=>20,'total'=>40], ['feb'=>15,'dec'=>15,'total'=>30], ]; ``` ## **二维数组 相同的某个字段值相同时,指定单个字段的数值相加** * $arr 二维数组 * $str1 相同字段的键 * $str2 要相加数值的键 ``` function Add($arr, $str1, $str2) { $item = array();//声明新数组 foreach ($arr as $k => $v) { if (!isset($item[$v[$str1]])) { $item[$v[$str1]] = $v;//$item["name"] = $v; } else { $item[$v[$str1]][$str2] += $v[$str2]; } } return $item; } $arr=[ ['id'=>1,'name'=>'dash','money'=>100], ['id'=>2,'name'=>'tom','money'=>100], ['id'=>3,'name'=>'dash','money'=>100], ]; $data=Add($arr,'name','money'); var_export($data); ``` 结果 ``` [ 'dash' =>[ 'id' => 1, 'name' => 'dash', 'money' => 200, ], 'tom' =>>[ 'id' => 2, 'name' => 'tom', 'money' => 100, ], ] ``` ## **二维数组 相同的某个字段值相同时,指定多个字段的数值相加** * $arr 二维数组 * $str1 相同字段的键 * $merge_field_arr 要相加数值的键的集合 ``` function Add($arr, $str1, $merge_field_arr) { $item = array(); foreach ($arr as $k => $v) { if (!isset($item[$v[$str1]])) { $item[$v[$str1]] = $v; } else { foreach($merge_field_arr as $merge_field){ $item[$v[$str1]][$merge_field] += $v[$merge_field]; } } } return $item; } $arr=[ ['id'=>1,'name'=>'dash','money'=>100,'cost'=>50], ['id'=>2,'name'=>'tom','money'=>100,'cost'=>50], ['id'=>3,'name'=>'dash','money'=>100,'cost'=>50], ]; $data=Add($arr,'name',['money','cost']); var_export($data); ``` 结果: ``` [ 'dash' =>[ 'id' => 1, 'name' => 'dash', 'money' => 200, 'cost' => 100, ], 'tom' =>>[ 'id' => 2, 'name' => 'tom', 'money' => 100, 'cost' => 50, ], ] ``` ## **二维数组 相同的某个字段值相同时,指定多个字段的数值相加(增加统计结果)** ``` function mergeAdd($arr, $str1, $merge_field_arr) { $item = array(); foreach ($arr as $k => $v) { if (!isset($item[$v[$str1]])) { $item[$v[$str1]] = $v; $item[$v[$str1]]['merge_count']=1; } else { foreach($merge_field_arr as $merge_field){ // $item[$v[$str1]][$merge_field] += $v[$merge_field]; $item[$v[$str1]][$merge_field]=bcadd($item[$v[$str1]][$merge_field], $v[$merge_field],2); } $item[$v[$str1]]['merge_count']+=1; } } return $item; //return array_values($item); //返回索引数组 } ``` ## 两个一维数组相同的键累加,不同的键合并 >[danger] +会将最先出现的键值作为结果,array_merge将最后出现的键值作为结果,还有一点不同的是array_merge会将相同的数字索引自动进行累加合并 ``` $arr1=array('name'=>33,'type'=>1); $arr2=array('name'=>33,'price'=>200); $res=array(); foreach($arr1 as $k=>$v){ if(isset($arr2[$k])){ $res[$k] =$arr1[$k] +$arr2[$k]; unset($arr1[$k],$arr2[$k]); } } $res=array_merge($res,$arr1,$arr2); $arr1=array('name'=>33,'type'=>1); $arr2=array('name'=>33,'price'=>200); $res=array(); foreach($arr1 as $k=>$v){ if(isset($arr2[$k])){ $res[$k] =$arr1[$k] +$arr2[$k]; } } $res=$res+$arr1+$arr2; ```