Как совместить два массива по глубокой клавише?

Я хочу объединить два массива, используя указанные глубокие значения подмассива.

У меня есть два разных массива с разными структурами, и я хочу объединить их так, чтобы, если "первичные ключи" совпадали, добавили значения второго массива в первый массив, если нет, то создали массив со значением массива 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 ответ

Решение

Мой подход будет использовать входной массив $a как массив результатов. foreach() будет перебирать подмассивы $b, $index (ключ подмассива в $a который держит upgrade_by значение в его created_by значение) находится по:

  1. Выделение самых глубоких подмассивов в $a"s Customer "столбцы" с помощью array_column() - это 3-элементные массивы.
  2. array_column() снова используется для изоляции created_by значения в этих подмассивах.
  3. array_search() ищет указанное число в новом изолированном массиве и, если оно существует, возвращает его индекс.

Когда индекс найден, $bзначения объединяются с $aзначения с использованием данного индекса и upgrade_by элемент опущен.

Когда индекс не найден, upgrade_by переименован created_by и элементы добавляются в $a в качестве нового клиента subarray.

Код: ( Демо-ссылка)

$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',
    ),
  ),
)
Другие вопросы по тегам