Как добавить слияние подмассивов из двух многомерных массивов

Извините за такой простой вопрос, но я новичок в PHP.
Я пытаюсь добавить isInStock ключи и значения из этого массива:

$stock массив:

Array
(
[0] => Array
(
[name] => name of item 1
[price] => 45.00
[colour] => Neon yellow
[image] => http://images1
[url] => http://url1
[productid] => 7985894
[variants] => Array
(
[0] => Array
(
[variantId] => 7986029
[isInStock] => 1
)
[1] => Array
(
[variantId] => 7986070
[isInStock] => 1
)
[2] => Array
(
[variantId] => 7985916
[isInStock] => 1
)
[3] => Array
(
[variantId] => 7985929
[isInStock] => 1
)

[4] => Array
(
[variantId] => 7985918
[isInStock] => 1
)
[5] => Array
(
[variantId] => 7985935
[isInStock] => 1
)
[6] => Array
(
[variantId] => 7985945
[isInStock] => 1
)
[7] => Array
(
[variantId] => 7985994
[isInStock] => 1
)
)
[productId] => 7985894
)
[1] => Array
(
[name] => name of item 2
[price] => 45.00
[colour] => Multi
[image] => http://images
[url] => http://url
[productid] => 8040851
[variants] => Array
(
[0] => Array
(
[variantId] => 8040898
[isInStock] => 1
)
[1] => Array
(
[variantId] => 8041115
[isInStock] => 1
)
[2] => Array
(
[variantId] => 8040904
[isInStock] => 1
)
[3] => Array
(
[variantId] => 8041132
[isInStock] => 1
)
[4] => Array
(
[variantId] => 8041015
[isInStock] => 1
)
[5] => Array
(
[variantId] => 8040942
[isInStock] => 1
)
[6] => Array
(
[variantId] => 8040954
[isInStock] => 1
)
[7] => Array
(
[variantId] => 8040990
[isInStock] => 1
)
)
[productId] => 8040851
)

и поместить их в этот массив под каждым size в соответствии с variantId значение, если они оба совпадают.

$data массив:

Array
(
[0] => Array
(
[name] => name 1
[price] => 45.00
[colour] => Neon yellow
[image] => http://url
[url] => http://url1
[productid] => 7985894
[variants] => Array
(
[0] => Array
(
[variantId] => 7986029
[size] => US 0
)
[1] => Array
(
[variantId] => 7986070
[size] => US 2
)
[2] => Array
(
[variantId] => 7985916
[size] => US 4
)
[3] => Array
(
[variantId] => 7985929
[size] => US 6
)
[4] => Array
(
[variantId] => 7985918
[size] => US 8
)
[5] => Array
(
[variantId] => 7985935
[size] => US 10
)
[6] => Array
(
[variantId] => 7985945
[size] => US 12
)
[7] => Array
(
[variantId] => 7985994
[size] => US 14
)
)
)
[1] => Array
(
[name] => name 1
[price] => 45.00
[colour] => Multi
[image] => http://url
[url] => http://url
[productid] => 8040851
[variants] => Array
(
[0] => Array
(
[variantId] => 8040898
[size] => US 0
)
[1] => Array
(
[variantId] => 8041115
[size] => US 2
)
[2] => Array
(
[variantId] => 8040904
[size] => US 4
)
[3] => Array
(
[variantId] => 8041132
[size] => US 6
)
[4] => Array
(
[variantId] => 8041015
[size] => US 8
)
[5] => Array
(
[variantId] => 8040942
[size] => US 10
)
[6] => Array
(
[variantId] => 8040954
[size] => US 12
)
[7] => Array
(
[variantId] => 8040990
[size] => US 14
)
)
)

Я пытался решить это некоторое время, но я продолжаю застрять. Я могу назначить отдельные значения, но не могу заставить его выполнять весь массив. Любая помощь будет оценена.

Я хотел бы, чтобы мой результирующий массив был таким:

Array
(
[0] => Array
(
[name] => name 1
[price] => 45.00
[colour] => Neon yellow
[image] => http://url
[url] => http://url1
[productid] => 7985894
[variants] => Array
(
[0] => Array
(
[variantId] => 7986029
[size] => US 0
[isInStock] => 1
)
[1] => Array
(
[variantId] => 7986070
[size] => US 2
[isInStock] => 1
)
[2] => Array
(
[variantId] => 7985916
[size] => US 4
[isInStock] => 1
)
[3] => Array
(
[variantId] => 7985929
[size] => US 6
[isInStock] => 1
)
[4] => Array
(
[variantId] => 7985918
[size] => US 8
[isInStock] => 1
)
[5] => Array
(
[variantId] => 7985935
[size] => US 10
[isInStock] => 1
)
[6] => Array
(
[variantId] => 7985945
[size] => US 12
[isInStock] => 1
)
[7] => Array
(
[variantId] => 7985994
[size] => US 14
[isInStock] => 1
)
)
)
[1] => Array
(
[name] => name 1
[price] => 45.00
[colour] => Multi
[image] => http://url
[url] => http://url
[productid] => 8040851
[variants] => Array
(
[0] => Array
(
[variantId] => 8040898
[size] => US 0
[isInStock] => 1
)
[1] => Array
(
[variantId] => 8041115
[size] => US 2
[isInStock] => 1
)
[2] => Array
(
[variantId] => 8040904
[size] => US 4
[isInStock] => 1
)
[3] => Array
(
[variantId] => 8041132
[size] => US 6
[isInStock] => 1
)
[4] => Array
(
[variantId] => 8041015
[size] => US 8
[isInStock] => 1
)
[5] => Array
(
[variantId] => 8040942
[size] => US 10
[isInStock] => 1
)
[6] => Array
(
[variantId] => 8040954
[size] => US 12
[isInStock] => 1
)
[7] => Array
(
[variantId] => 8040990
[size] => US 14
[isInStock] => 1
)
)
)

Пока я пробовал array_merge который не ставит значения в нужном месте.
Я пробовал это $data['isInstock'] = $stock[0]['variants'][0]['variantId']; что тоже не сработает.

0

Решение

К сожалению, требуется много итераций / подготовки, чтобы подготовить два массива для использования с array_merge_recursive(), Я признаю, я не горжусь сверткой в ​​моем методе. Основным фактором всего этого является то, что array_merge_recursive() только «хорошо играет» с нечисловыми индексами, поэтому мне пришлось заменить ваши численно проиндексированные ключи на относительные значения идентификаторов в массивах. Я сделаю все возможное, чтобы объяснить мои шаги, но опять же, это не красиво … (демонстрация)

Шаг № 1: Подготовьтесь $stock массив:

foreach($stock as $subarray){
$new_stock["#{$subarray['productid']}"]=$subarray;  // replace outer key
$new_variants=[];                                   // declare a fresh array
foreach($subarray['variants'] as $varsub){
$new_variants["#{$varsub['variantId']}"]['isInStock']=$varsub['isInStock'];  // one element only
// omitting variantId element this time as the next array will offer it.
}
$new_stock["#{$subarray['productid']}"]['variants']=$new_variants;
}

Шаг № 2: Подготовьтесь $data массив & слияния:

foreach($data as $subarray){
$new_data["#{$subarray['productid']}"]=$subarray;  // replace outer key
$new_variants=[];                                  // declare a fresh array
foreach($subarray['variants'] as $varsub){
$new_variants["#{$varsub['variantId']}"]=$varsub; // both elements from variants
}
$new_data["#{$subarray['productid']}"]['variants']=array_values(array_merge_recursive($new_variants,$new_stock["#{$subarray['productid']}"]['variants']));
// new variants subarray has been merged, re-indexed, and written to $new_data
}

Шаг № 3: переиндексировать ключи внешнего массива и отобразить:

$result=array_values($new_data);
var_export($result);

Основная часть подготовки массива заключается в создании уникальных идентификаторов для внешнего и внутреннего массивов (в обоих $stock & $data). Это позволяет array_merge изолировать связанный productidи рекурсивно объединить variant элементы.

Если эти два массива генерируются из базы данных, тогда я настоятельно рекомендую использовать доступную функциональность базы данных для объединения этих данных вместо php.

Для простого примера того, как array_merge_recursive() работает вот маленький демонстрация. Поэкспериментируйте с ключами в любом из массивов. Если вы так много, как удалить # из числовой строки, array_merge_recursive() будет предполагать, что он имеет дело с числовыми индексами и измельчать вещи. Моя техника для сохранения ваших идентификаторов в виде строк заключалась в #, но это можно было сделать, добавив к значению ключа любой из ряда нецифровых символов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]