@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";рабочие диапазоны
       )
    )


Подскажите, как их объединить с учетом, чтобы это работало не слишком долго и не съело всю память
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ответы на вопрос 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);
Ответ написан
SagePtr
@SagePtr
Еда - это святое
Как вариант - преобразовать оба массива в ассоциативные с product_id в роли ключа, а затем пробежаться по второму массиву и добавить в первый недостающие элементы или отдельные атрибуты, если элементы сами есть. Сложность O(N) + O(M), дополнительный расход памяти N+M
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Amigoweb Магнитогорск
от 40 000 до 60 000 руб.
Roonyx Ростов-на-Дону
от 50 000 до 100 000 руб.
Ultimate Guitar Калининград
от 1 000 до 3 000 usd.