php 多维数组相同键值处理合并

一、前言

在实际情况中,有时需要针对多维数组相同键值作相应的处理(四则运算、比较大小等)后才能够使用到实际情况中,现给出三维数组(多维数组可相应拓展)任意多个相同键值处理的函数,以备查阅。

二、代码

 1 <?php
 2 //任意多个相同键值的数组合并
 3 //预先将所要合并的数组组装成一个新的数组
 4 
 5     $arr = array(
 6       '1' => array(
 7             '1' => array(
 8                 "channelName"         => "渠道1",
 9                 "firstRegisterTime"   => "2018-12-20 10:23:57",
10                 "firstChargeNum"      => 168,
11             ),
12             '2' => array(
13                 "channelName"         => "渠道2",
14                 "firstRegisterTime"   => "2018-12-20 10:23:57",
15                 "firstChargeNum"      => 127,
16             ),
17             '3' => array(
18                 "channelName"         => "渠道3",
19                 "firstRegisterTime"   => "2018-12-10 11:23:57",
20                 "firstChargeNum"      => 69,
21             ),
22         ),
23       '2' => array(
24             '1' => array(
25                 "channelName"         => "渠道1",
26                 "firstRegisterTime"   => "2017-12-29 10:23:57",
27                 "firstChargeNum"      => 798,
28             ),
29             '2' => array( 
30                 "channelName"         => "渠道2",
31                 "firstRegisterTime"   => "2018-12-20 10:23:57",
32                 "firstChargeNum"      => 985,
33             ),
34             '3' => array(
35                 "channelName"         => "渠道3",
36                 "firstRegisterTime"   => "2017-12-20 11:23:57",
37                 "firstChargeNum"      => 54,
38             ),
39         ),
40     );
41     print_r($arr);
42     $result = arr_format($arr);
43     print_r($result);
44     
45     /**
46      * [comm_sumarrs 多维数组相同键值处理合并]
47      * @param  [array] $data   [原始数据]
48      * @return [array] $res    [合并完数据]
49      *
50      */
51     function arr_format($arr){
52         $res = array();
53         // 三维数组,循环三次(foreach)
54         foreach ( $arr as $key => $value ) {
55             foreach( $value as $k=>$v ){
56                 foreach ( $v as $k1 => $v1 ) {    // 循环具体键值
57                     if ( isset($res[$k][$k1]) ){
58                         if ( $k1 == 'firstRegisterTime' ) { // 相同键值时间戳比较,更新为最早的
59                             if( strtotime($v1) < strtotime($res[$k][$k1]) ){
60                                 $res[$k][$k1] = $v1;
61                             }
62                         }
63                         if ( $k1 == 'firstChargeNum' ) { // 相同键值相加
64                             $res[$k][$k1] += $v1;
65                         }
66                     }else{
67                         $res[$k][$k1] = $v1;
68                     }
69                 }
70             }
71         }
72         return $res;
73     }
74     
75 ?>

三、运行结果

处理前数组:

 1 Array
 2 (
 3     [1] => Array
 4         (
 5             [1] => Array
 6                 (
 7                     [channelName] => 渠道1
 8                     [firstRegisterTime] => 2018-12-20 10:23:57
 9                     [firstChargeNum] => 168
10                 )
11 
12             [2] => Array
13                 (
14                     [channelName] => 渠道2
15                     [firstRegisterTime] => 2018-12-20 10:23:57
16                     [firstChargeNum] => 127
17                 )
18 
19             [3] => Array
20                 (
21                     [channelName] => 渠道3
22                     [firstRegisterTime] => 2018-12-10 11:23:57
23                     [firstChargeNum] => 69
24                 )
25 
26         )
27 
28     [2] => Array
29         (
30             [1] => Array
31                 (
32                     [channelName] => 渠道1
33                     [firstRegisterTime] => 2017-12-29 10:23:57
34                     [firstChargeNum] => 798
35                 )
36 
37             [2] => Array
38                 (
39                     [channelName] => 渠道2
40                     [firstRegisterTime] => 2018-12-20 10:23:57
41                     [firstChargeNum] => 985
42                 )
43 
44             [3] => Array
45                 (
46                     [channelName] => 渠道3
47                     [firstRegisterTime] => 2017-12-20 11:23:57
48                     [firstChargeNum] => 54
49                 )
50 
51         )
52 
53 )

处理后数组:

Array
(
    [1] => Array
        (
            [channelName] => 渠道1
            [firstRegisterTime] => 2017-12-29 10:23:57
            [firstChargeNum] => 966
        )

    [2] => Array
        (
            [channelName] => 渠道2
            [firstRegisterTime] => 2018-12-20 10:23:57
            [firstChargeNum] => 1112
        )

    [3] => Array
        (
            [channelName] => 渠道3
            [firstRegisterTime] => 2017-12-20 11:23:57
            [firstChargeNum] => 123
        )

)

猜你喜欢

转载自www.cnblogs.com/whx-blogs/p/10271932.html