Я хочу объединить два массива, используя указанные глубокие значения подмассива.
У меня есть два разных массива с разными структурами, и я хочу объединить их так, чтобы, если «первичные ключи» совпадали, добавили значения второго массива в первый массив, если нет, то создали массив со значением массива 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]
Мой подход будет использовать входной массив $a
как массив результатов. foreach()
будет перебирать подмассивы $b
, $index
(ключ подмассива в $a
который держит upgrade_by
значение в его created_by
значение) находится по:
$a
«s Customer
«столбцы» с помощью array_column()
— это 3-элементные массивы.array_column()
снова используется для изоляции created_by
значения в этих подмассивах.array_search()
ищет указанное число в новом изолированном массиве и, если оно существует, возвращает его индекс.Когда индекс найден, $b
значения объединяются с $a
значения с использованием данного индекса и upgrade_by
элемент опущен.
Когда индекс не найден, upgrade_by
переименован created_by
и элементы добавляются в $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);
Выход:
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',
),
),
)
Других решений пока нет …