@bysobi

Как соединить два многомерных массива?

Есть два массива:
$products и
$attributes
В массивах содержится одинаковое количество элементов. Их может быть до 500 000 ел.
Необходимо их объединить в один массив, чтобы потом можно было работать с ним. У них есть связующий элемент: product_id

**Массив продуктов**

$products = array(
       [0] = array(
           [product_id] => 102966
           [price] => 11
       )
       [1] = array(
           [product_id] => 102967
           [price] => 22
       )
    )


**Массив атрибутов**

$attributes= array(
       [0] = array(
           [product_id] => 102966
           [attr_name] => Диагональ;Длительность ролика
           [attr_value] => 2";1 мин, 2 мин, 3 мин, 5 мин
       )
       [1] = array(
           [product_id] => 102967
           [attr_name] => Выходы;Диагональ;Дополнительная информация
           [attr_value] => HDMI;2.7";рабочие диапазоны
       )
    )


Подскажите, как их объединить с учетом, чтобы это работало не слишком долго и не съело всю память
  • Вопрос задан
  • 334 просмотра
Решения вопроса 2
Решение "в лоб", но работать будет

$products = [
	[
		'product_id' => 102966,
		'price'      => 11,
	],
	[
		'product_id' => 102967,
		'price'      => 22,
	]
];

$attributes = [
	[
		'product_id'    => 102966,
		'attr_name'     => 'Диагональ;Длительность ролика',
		'attr_value'    => '2";1 мин, 2 мин, 3 мин, 5 мин',
	],
	[
		'product_id'    => 102967,
		'attr_name'     => 'Выходы;Диагональ;Дополнительная информация',
		'attr_value'    => 'HDMI;2.7";рабочие диапазоны',
	],
];

$products = array_map(function($product) use ( $attributes ) {
	$attribute = array_filter($attributes, function($attribute) use ( $product ) {
		return $attribute['product_id'] === $product['product_id'];
	});

	return array_merge($attribute ? current($attribute) : [], $product);
}, $products);

print_r($products);
Ответ написан
DevMan
@DevMan
$products = [
	[
		'product_id' => 102966,
		'price'      => 11,
	],
	[
		'product_id' => 102967,
		'price'      => 22,
	]
];

$attributes = [
	[
		'product_id'    => 102967,
		'attr_name'     => 'Диагональ;Длительность ролика',
		'attr_value'    => '2";1 мин, 2 мин, 3 мин, 5 мин',
	],
	[
		'product_id'    => 102966,
		'attr_name'     => 'Выходы;Диагональ;Дополнительная информация',
		'attr_value'    => 'HDMI;2.7";рабочие диапазоны',
	],
];

$products = array_column($products, null, 'product_id');
$attributes = array_column($attributes, null, 'product_id');
foreach($products as &$product) {
	$product += $attributes[$product['product_id']];
}
print_r($products);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SagePtr
@SagePtr
Еда - это святое
Как вариант - преобразовать оба массива в ассоциативные с product_id в роли ключа, а затем пробежаться по второму массиву и добавить в первый недостающие элементы или отдельные атрибуты, если элементы сами есть. Сложность O(N) + O(M), дополнительный расход памяти N+M
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы