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

169
11 сентября 2018, 02:50

Есть два массива:

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

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

Есть решение: Но ест много ресурсов...

$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);
Answer 1

Для каких целей это делается? Запрос к данному массиву будет у каждого юзера на сайте постоянно? Например при открытии корзины или страницы товаров?

Если да, то лучше создать отдельный файл, который выполняет ваш "ресурсоемкий код" и далее записывает построчный результат (соедененныого массива) в некую новую таблицу в базе. Установить этот файл в crontab и пускайте он запускается раз в минуту, раз в час и т.д. Время можете установить исходя из вероятности обновления $products и $attributes.

Как понимаем, речь об интернет магазине и вряд ли прям каждую минуту будут добавляться товары или новые атрибуты.

Ну а для самого пользователя выборка будет с конкретной таблице (а лучше к кешу) с уже готовым общим массивом.

READ ALSO
RedBeanPhp ошибка

RedBeanPhp ошибка

Выдает ошибку

179
Illegal string offset как исправить?

Illegal string offset как исправить?

Добрых времен суток и тд! Такая проблема: Я полнейший камень в PHP, просто дубИмеется следующая проблема - ОШИБКИ:

158
php хранение паролей (Laravel)

php хранение паролей (Laravel)

Везде пишут что не стоит хранить пароли в открытом виде

165