【问题标题】:How to make custom associative array using an array with foreach in php如何在php中使用带有foreach的数组制作自定义关联数组
【发布时间】:2020-10-07 16:23:09
【问题描述】:

我有一个订单数组。现在我想根据它们的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();

我该怎么做?

【问题讨论】:

  • 试试$data = json_encode($CompleteOrders);

标签: php arrays laravel associative-array


【解决方案1】:

看起来你过度设计了

https://laravel.com/docs/7.x/collections#method-groupby

我认为您的OrdersWithProductDetails 是一个 Laravel 集合,您可以使用 GroupBy 按 order_id 对它们进行分组

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

【讨论】:

  • 谢谢,效果很好!!而且我还想知道,如果不使用 groupBy,我怎么能得到这个。我的意思是使用 foreach 或任何其他方法??
  • 好吧,你可以使用普通数组获得相同的结果,但这不是 laravel 的方式,使用集合可以做更多有趣的事情
  • 好的,明白了。但是,在我的例子中,我在 foreach 和 for 循环中做错了什么??
猜你喜欢
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
相关资源
最近更新 更多