【问题标题】:How to combine two arrays by deep key?如何通过深度键组合两个数组?
【发布时间】:2017-03-05 02:05:12
【问题描述】:

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

我有两个具有不同结构的不同数组,我想将它们组合起来,以便如果“主键”匹配,则将第二个数组的值添加到第一个数组,如果不匹配,则使用数组 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]

【问题讨论】:

  • 是的,我还在寻找这个解决方案

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


【解决方案1】:

我的方法将使用输入数组$a 作为结果数组。 foreach() 将循环通过 $b 的子数组。 $index($a 中的子数组的键,在其 upgrade_by 值中包含 upgrade_by 值)由以下人员找到:

  1. 使用array_column() 隔离$a 的Customer“列”中最深的子数组——这些是三元素数组。
  2. array_column() 再次用于隔离这些子数组中的 created_by 值。
  3. array_search() 在新的孤立数组中寻找指定的数字,如果存在,则返回其索引。

找到索引后,$b 的值使用给定索引与$a 的值合并,upgrade_by 元素被省略。

当没有找到索引时,upgrade_by 被重命名为created_by 并且元素被添加到$a 作为一个新的客户子数组。

代码:(Demo Link)

$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);

输出:

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',
      'refund_amount' => 100,
      'company' => 'First Company',
    ),
  ),
  2 => 
  array (
    'Customer' => 
    array (
      'created_by' => 3,
      'refund_amount' => 250,
      'company' => 'Last Company',
    ),
  ),
)

【讨论】:

  • 一切正常。我有三个需要合并的类似数组。在这种情况下,我首先使用此代码帮助合并两个数组,然后再次将合并数组与第三个数组合并。它工作正常,但代码非常繁重。因为任何或所有数组都可能为空,我必须运行多个 if else 条件。 :)
  • @SAHAR 正如你所知,我已经改进了我的代码。请在循环之前实现我对$created_by_indexes 的小改动。虽然旧版本“运行良好”,但我更喜欢发布优化/改进的方法,以便未来的读者可以看到最佳实践。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 2021-08-02
  • 2015-07-29
  • 1970-01-01
  • 2021-08-09
  • 2017-05-12
  • 2019-10-07
  • 2013-09-26
相关资源
最近更新 更多