@kolomat

Как объединись значения из двух массивов в один?

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

[110] => Array
                (
                    [order_id] => 3618
                    [firstname] => тест 
                    [lastname] => тест
                    [telephone] => 222222222
                    [product_id] => 32344
                    [quantity] => 1
                    [sku] => 62a194e0c4f39f7026518532
                )

            [111] => Array
                (
                    [order_id] => 3618
                    [firstname] => тест 
                    [lastname] => тест
                    [telephone] => 222222222
                    [product_id] => 32342
                    [quantity] => 1
                    [sku] => 62a194ddc4f39f70265184d4
                )

order_id у этих массивов одинаковый и все остальные данные тоже, кроме товаров а именно product_id, quantity, sku.
Надо их объединить, чтобы получить массив такого вида:

[111] => Array
                (
                    [order_id] => 3618
                    [firstname] => тест 
                    [lastname] => тест
                    [telephone] => 222222222
                   [products] => array (
                    [0] => array (
                                      [product_id] => 32344
                                      [sku] => 62a194e0c4f39f7026518532
                                       [quantity] => 1
)
                   [1] => array (
                                      [product_id] => 32342
                                      [sku] => 62a194ddc4f39f70265184d4
                                       [quantity] => 1
)
)
                )
  • Вопрос задан
  • 121 просмотр
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Возможно. Просто пройдитесь по имеющемуся массиву и сформируйте новый. В качестве ключа проще всего использовать order_id.
Ответ написан
Комментировать
0xD34F
@0xD34F
$extract = fn($keys, $item) => array_combine($keys, array_map(fn($k) => $item[$k], $keys));

$grouped = [];
$productKeys = [ 'product_id', 'sku', 'quantity' ];
$orderKeys = array_diff(array_keys($arr[0] ?? []), $productKeys);

foreach ($arr as $n) {
  $id = $n['order_id'];
  $grouped[$id] ??= $extract($orderKeys, $n);
  $grouped[$id]['products'][] = $extract($productKeys, $n);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
Типичная ситуация преобразовать плоский массив, полученный из запроса, в более объемный вложенный массив:
$rows = /* тут выполняется запрос для получения данных */;
$out_data = []; // массив выходных данных
foreach($rows as $row)
{
  $order = &$out_data[$row['order_id']]; // ссылка на элемент массива заказа
  $order['order_id'] = $row['order_id'];
  $order['firstname'] = $row['firstname'];
  $order['lastname'] = $row['lastname'];
  $order['telephone'] = $row['telephone'];
  if(!isset($order['products'])) $order['products'] = []; // этот if  нужен, если обязательно наличие ключа products с пустым массивом, если в выборке возможны пустые реквизиты продукта.
  if(!is_null($row['product_id']))
  { 
    $product = &$order['products'][$row['product_id']]; // делаем ссылку на элемент массива products с уникальным ключом product_id
    $product['product_id'] = $row['product_id'];
    $product['sku'] = $row['sku'];
    $product['quantity'] = $row['quantity'];
    // ... таким же способом можно делать более глубокие ссылки в product, если в этом элементе понадобится массив данных
    unset($product); // уничтожайте ссылку в конце цикла, иначе не сможете переиспользовать переменную $product за циклом.
  }
  unset($order);
}
Ответ написан
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Если данные нужны для нескольких заказов, то вариант @Rsa97
Если только одного заказа, то проще двумя запросами, результат второго просто подцепить в виде отдельного элемента к массиву, полученному из первого
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽