如何通过深键组合两个数组?

时间:2016-10-23 02:47:44

标签: php arrays merge array-merge array-column

我想使用指定的深子阵列值组合两个数组。

我有两个不同结构的不同数组,我希望将它们组合起来,这样如果“主键”匹配,则将第二个数组的值添加到第一个数组,如果没有,则创建数组2值的数组。

第一个数组中的主键是[created_by],第二个数组中的主键是[upgrade_by]

Array1是:

Array(      
        [0] => Array(
                [Customer] => Array(
                        [created_by] => 5
                        [amount] => 199
                        [name] => First Cux
                )
        )
        [1] => Array(
                [Customer] => Array(
                        [created_by] => 1
                        [amount] => 199
                        [name] => Last Cux
                )
        )
)

数组2是

Array(
        [0] => Array(
                [0] => Array(
                        [refund_amount] => 100
                )
                [Historycustomer] => Array(
                        [upgrade_by] => 1
                        [company] => First Company
                )
        )
        [1] => Array(
                [0] => Array(
                        [refund_amount] => 250
                )
                [Historycustomer] => Array(
                        [upgrade_by] => 3
                        [company] => Last Company
                )
        )
)

我需要这样的结果:

Array(      
        [0] => Array(
                [Customer] => Array(
                        [created_by] => 5
                        [amount] => 199
                        [name] => First Cux
                )
        )
        [1] => Array(
                [Customer] => Array(
                        [created_by] => 1
                        [amount] => 199
                        [refund_mount]=>100
                        [name] => Last Cux
                        [company] => First Company
                )
        )
        [2] => Array(
                [Customer] => Array(
                        [created_by] => 3
                        [refund_mount]=>250
                        [company] => Last Company
                )
        )
)

第一个数组中的主键是[created_by],第二个数组中的主键是[upgrade_by]

1 个答案:

答案 0 :(得分:1)

我的方法将使用输入数组$a作为结果数组。 foreach()将遍历$b的子数组。 $index$a中包含upgrade_bycreated_by值的子数组的关键字可以通过以下方式找到:

  1. 使用$a隔离Customer的{​​{1}}“列中最深的子数组 - 这些是3元素数组。
  2. array_column()再次用于隔离这些子数组中的array_column()值。
  3. created_by搜索新隔离数组中的指定数字,如果存在,则返回其索引。
  4. 找到索引后,使用给定索引将array_search()的值与$b的值合并,并省略$a元素。

    如果找不到索引,upgrade_by将重命名为upgrade_by,并且这些元素会作为新客户子阵列添加到created_by

    代码:(Demo Link

    $a

    输出:

    $a=[
        ['Customer'=>['created_by'=>5,'amount'=>199,'name'=>'First Cux']],
        ['Customer'=>['created_by'=>1,'amount'=>199,'name'=>'Last Cux']]
    ];
    $b=[
        [['refund_amount'=>100],'Historycustomer'=>['upgrade_by'=>1,'company'=>'First Company']],
        [['refund_amount'=>250],'Historycustomer'=>['upgrade_by'=>3,'company'=>'Last Company']]
    ];
    $created_by_indexes=array_column(array_column($a,'Customer'),'created_by');
    foreach($b as $b1){
        $index=array_search($b1['Historycustomer']['upgrade_by'],$created_by_indexes);
        if($index!==false){
            $a[$index]['Customer']+=['refund_amount'=>$b1[0]['refund_amount'],'company'=>$b1['Historycustomer']['company']];
        }else{
            $a[]=['Customer'=>['created_by'=>$b1['Historycustomer']['upgrade_by'],'refund_amount'=>$b1[0]['refund_amount'],'company'=>$b1['Historycustomer']['company']]];
        }
    }
    var_export($a);