Вы можете использовать array_combine()
, чтобы начать использовать unique_codename
в качестве ключей в исходном массиве, чтобы разрешить поиск по нему. Затем вы можете использовать цикл над новым массивом и проверить, существует ли codename
в «основном массиве». Если бы вы могли добавить новый type
внутри types
в основном массиве:
$init = array(); // your initial array
$array = array(); // your new array
$init = array_combine(array_column($init, 'unique_codename'), $init);
foreach ($array as $k => $item) {
if (isset($init[$item['codename']])) {
foreach ($init[$item['codename']]['sorts'] as &$sort) { // $sort is used as reference
if ($sort['name'] == $item['name']) {
$sort['types'][] = $item['type'];
}
}
}
}
print_r(array_values($init));
Вывод (см. онлайн-демонстрация ):
Array
(
[0] => Array
(
[unique_codename] => cars
[sorts] => Array
(
[0] => Array
(
[codename] => cars
[name] => audi
[types] => Array
(
[0] => a2
[1] => a6
)
)
[1] => Array
(
[codename] => cars
[name] => volvo
)
)
[category] => vehicle
)
[1] => Array
(
[unique_codename] => fruit
[sorts] => Array
(
[0] => Array
(
[codename] => fruit
[name] => banana
[types] => Array
(
[0] => yellowbanana
[1] => brownbanana
[2] => greenbanana
)
)
Пример с данными:
$init = [
[
'unique_codename'=>'cars',
'sorts'=>[
['codename' => 'cars', 'name' => 'audi'],
['codename' => 'cars', 'name' => 'volvo']
],
'category'=>'vehicle',
],
[
'unique_codename'=>'fruit',
'sorts'=>[
['codename' => 'fruit', 'name' => 'banana'],
['codename' => 'fruit', 'name' => 'apple'],
],
'category'=>'food',
],
[
'unique_codename'=>'vegetables',
'sorts'=>[
['codename' => 'vegetables', 'name' => 'cauliflower'],
],
'category'=>'food',
],
];
$array = [
['codename'=>'fruit', 'name'=>'banana', 'type'=>'yellowbanana'],
['codename'=>'fruit', 'name'=>'banana', 'type'=>'brownbanana'],
['codename'=>'cars', 'name'=>'audi', 'type'=>'a2'],
['codename'=>'fruit', 'name'=>'banana', 'type'=>'greenbanana'],
['codename'=>'cars', 'name'=>'audi', 'type'=>'a6'],
['codename'=>'cars', 'name'=>'other', 'type'=>'dummytext1'],
['codename'=>'cars', 'name'=>'other', 'type'=>'dummytext2'],
];
$init = array_combine(array_column($init, 'unique_codename'), $init);
foreach ($array as $k => $item) {
if (isset($init[$item['codename']])) {
foreach ($init[$item['codename']]['sorts'] as &$sort) {
if ($sort['name'] == $item['name']) {
$sort['types'][] = $item['type'];
}
}
}
}
print_r(array_values($init));