php多个数组 当date和customer的值一样 求和

$a = [
['date' => '2017-06-9', 'customer' => 1161, 'total' => 3, 'cg' => 1],
['date' => '2017-06-11', 'customer' => 1163, 'total' => 8, 'cg' => 3],
['date' => '2017-06-14', 'customer' => 1163, 'total' => 10, 'cg' => 5],
['date' => '2017-06-12', 'customer' => 1163, 'total' => 4, 'cg' => 2],

];
$b = [
['date' => '2017-06-10', 'customer' => 1161, 'total' => 3, 'cg' => 1],
['date' => '2017-06-11', 'customer' => 1163, 'total' => 9, 'cg' => 2],
['date' => '2017-06-13', 'customer' => 1165, 'total' => 6, 'cg' => 5],
['date' => '2017-06-11', 'customer' => 1165, 'total' => 5, 'cg' => 2]
];

//我写了个下面的数组处理方法,有更好的方法吗???

//代码开始

function merge_arr($myArray, $subArr){

$sArray = $zArray =  array();
foreach ($myArray as $k=>$subArray) {
   foreach ($subArr as $id=>$value) {
        if($subArray && $value && ($subArray['date'] == $value['date'] && $subArray['customer'] == $value['customer'])){
            $subArr[$id]['total'] += $subArray['total'];
            $subArr[$id]['cg'] += $subArray['cg'];
            unset($myArray[$k]);
        }
    }
 }
 return array_merge($myArray, $subArr);

}

print_r(merge_arr($myArray, $subArr));
//代码结束

//求最优处理上述数组的方法 我这个只能处理2组数组
//如果2组以上呢?我只能拿2组合并后的结果 再去处理第3个数组 有没优化方法

$mArray = merge_arr($myArray,$subArr);//前2组合并
$threeArray = merge_arr($mArray, $threeArr);

阅读 2.5k
2 个回答

        $a = [
            ['date' => '2017-06-9', 'customer' => 1161, 'total' => 3, 'cg' => 1],
            ['date' => '2017-06-11', 'customer' => 1163, 'total' => 8, 'cg' => 3],
            ['date' => '2017-06-14', 'customer' => 1163, 'total' => 10, 'cg' => 5],
            ['date' => '2017-06-12', 'customer' => 1163, 'total' => 4, 'cg' => 2],

        ];
        $b = [
            ['date' => '2017-06-10', 'customer' => 1161, 'total' => 3, 'cg' => 1],
            ['date' => '2017-06-11', 'customer' => 1163, 'total' => 9, 'cg' => 2],
            ['date' => '2017-06-13', 'customer' => 1165, 'total' => 6, 'cg' => 5],
            ['date' => '2017-06-11', 'customer' => 1165, 'total' => 5, 'cg' => 2],
        ];

        $c = [
            ['date' => '2017-06-10', 'customer' => 1161, 'total' => 43, 'cg' => 1],
            ['date' => '2017-06-11', 'customer' => 1163, 'total' => 9, 'cg' => 2],
            ['date' => '2017-06-13', 'customer' => 1165, 'total' => 6, 'cg' => 5],
            ['date' => '2017-06-11', 'customer' => 1165, 'total' => 5, 'cg' => 2],
        ];
        
        //...........

        //array_merge — 合并一个或多个数组
        // $temp = array_merge($a, $b, $c , $b , $d , $e , ...........);
        $temp = array_merge($a, $b, $c);

        $res = [];
        foreach ($temp as $item) {
            $year = $item['date'];
            $userId = $item['customer'];
            if(!isset($arr[$year.$userId])){
                $res[$year.$userId] =
                    [
                      'date' => $year,
                      'customer' => $userId,
                      'cg' => 0,
                      'total' => 0,
                    ];
            }
        }
        foreach ($temp as $tep) {
            if(isset($res[$tep['date'].$tep['customer']])){
                $res[$tep['date'].$tep['customer']]['total'] += $tep['total'];
                $res[$tep['date'].$tep['customer']]['cg'] += $tep['cg'];
            }
        }

        print_r(sort($res));

直接加:

    
    $a = [
        ['date' => '2017-06-9', 'customer' => 1161, 'total' => 3, 'cg' => 1],
        ['date' => '2017-06-11', 'customer' => 1163, 'total' => 8, 'cg' => 3],
        ['date' => '2017-06-14', 'customer' => 1163, 'total' => 10, 'cg' => 5],
        ['date' => '2017-06-12', 'customer' => 1163, 'total' => 4, 'cg' => 2],

    ];
    $b = [
        ['date' => '2017-06-10', 'customer' => 1161, 'total' => 3, 'cg' => 1],
        ['date' => '2017-06-11', 'customer' => 1163, 'total' => 9, 'cg' => 2],
        ['date' => '2017-06-13', 'customer' => 1165, 'total' => 6, 'cg' => 5],
        ['date' => '2017-06-11', 'customer' => 1165, 'total' => 5, 'cg' => 2],
    ];

    $c = [
        ['date' => '2017-06-10', 'customer' => 1161, 'total' => 43, 'cg' => 1],
        ['date' => '2017-06-11', 'customer' => 1163, 'total' => 9, 'cg' => 2],
        ['date' => '2017-06-13', 'customer' => 1165, 'total' => 6, 'cg' => 5],
        ['date' => '2017-06-11', 'customer' => 1165, 'total' => 5, 'cg' => 2],
    ];
    
    $arr = array_merge($a, $b, $c);
    $result = array();
    foreach ($arr as $val) {
        if(empty($val)) {
            continue;
        }
        $key = $val['date'] . '-' . $val['customer'];
        if(!isset($result[$key])) {
            $result[$key] = $val;
            continue;
        }
        $result[$key]['cg']    += (int)$val['cg'];
        $result[$key]['total'] += (int)$val['total'];
    }
    $result = array_values($result);
    var_dump("<pre>", $result);die;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题