Как создать собственный ассоциативный массив, используя массив с foreach в php - PullRequest
0 голосов
/ 17 июня 2020

У меня есть массив заказов. Теперь я хочу сгруппировать элементы массива в соответствии с их order_id. Затем я сделал как показано ниже ...

$CompleteOrders = [];

        $OrderCount = 0;
        foreach($OrdersWithProductDetails as $OrdersWithProductDetail) {

            if(empty($CompleteOrders)) {
                $CompleteOrders[$OrderCount][$OrderCount] = $OrdersWithProductDetail;
            } else {
                for($i = 0; $i < count($CompleteOrders); $i++) {
                    if(isset($CompleteOrders[$i][$i])) {
                        if($CompleteOrders[$i][$i]->order_id == $OrdersWithProductDetail->order_id) {
                            $CompleteOrders[$i][$OrderCount+1] = $OrdersWithProductDetail;
                            //print_r($CompleteOrders);
                            $OrderCount++;
                        } else {
                            $CompleteOrders[$OrderCount+1][0] = $OrdersWithProductDetail;
//                        print_r($CompleteOrders);
                            $OrderCount++;
                        }
                    }
                }
//                break;
            }

        }

        dd($CompleteOrders);

Но, когда я печатаю массив $CompleteOrders, в первом элементе (0) есть все детали заказа, которые принадлежат order_id 93. но , после этого элементы имеют разные ключи (3 и 4), даже если они имеют одинаковые order_id, как показано ниже.

array:3 [▼
  0 => array:3 [▶]
  3 => array:1 [▶]
  4 => array:1 [▼
    0 => {#1268 ▼
      +"id": 102
      +"size": "30"
      +"order_quantity": "1"
      +"price": "798"
      +"created_at": "2020-06-16 19:24:00"
      +"updated_at": "2020-06-16 19:24:00"
      +"order_id": "94"
      +"owi_id": "255"
      +"item_id": "36"
      +"item_name": "Acc One"
      +"description": "Test"
      +"quantity": null
      +"main_fileimg": "1 (1).jpg"
      +"main_filepath": "assets/img/product/accessories/"
      +"main_category": "Accessories"
      +"category": "Denim"
      +"final_total_amount": "1593"
      +"cus_name": "Customer Name"
      +"tel_no": "123456789"
      +"email": "email@gmail.com"
      +"address_line_one": "Earth Rd"
      +"address_line_two": "Neptune"
      +"city": "Sun"
    }
  ]
]

Я хочу создать массив, как показано ниже.

$Orders = 
    0 => [
         0 => "OrderId94"
              "Item"
         1 => "OrderId94"
              "Item"
],
    1 => [
         0 => "OrderId94"
              "Item"
         1 => "OrderId94"
              "Item"
]

** РЕДАКТИРОВАТЬ **

$OrdersWithProductDetails = DB::table('order_id_with_owi_ids')
            ->join('orders_with_items','orders_with_items.id','order_id_with_owi_ids.owi_id')
            ->join('item_id_with_owi_ids','item_id_with_owi_ids.owi_id','orders_with_items.id')
            ->join('products','products.item_id','item_id_with_owi_ids.item_id')
            ->join('item_with_main_categories','item_with_main_categories.item_id','products.item_id')
            ->select('orders_with_items.*', 'order_id_with_owi_ids.*', 'products.*')
            ->get();

Как я могу это сделать?

1 Ответ

1 голос
/ 17 июня 2020

Похоже, вы слишком усложняете

А как насчет https://laravel.com/docs/7.x/collections#method -groupby

Я думаю, что ваша OrdersWithProductDetails - это коллекция Laravel, которую вы можете использовать GroupBy группировать их по order_id

$grouped = $OrdersWithProductDetails->groupBy('order_id');
$grouped = $grouped->toArray();
dd($grouped);
...