簡體   English   中英

父級下的 PHP 組數組子級?

[英]PHP Group Array Children under Parent?

我有一個返回以下內容的數組:

   $products = [
    'product' => [
      [
        "product_parent" =>  "Parent Name 1",
        "product_name" =>  "Product 1",
      ],
      [
        "product_parent" =>  "Parent Name 1",
        "product_name" =>  "Product 2",
      ],
      [
        "product_parent" =>  "Parent Name 2",
        "product_name" =>  "Product 1",
      ],
      [
        "product_parent" =>  "Parent Name 3",
        "product_name" =>  "Product 1",
      ]
    ]
  ];

我需要返回一個像這樣結構的新數組,它是(關聯)數組的(索引)數組

   'product' => [
      0 => [
        'product_name' => 'Parent Name 1'
        'product_info' => [
          0 => [
            "product_name" =>  "Product 1",
          ],
          1 => [
            "product_name" =>  "Product 2",
          ]
        ]
      ],
      1 => [
        'product_name' => 'Parent Name 2'
        'product_info' => [
          0 => [
            "product_name" =>  "Product 1",
          ],
          1 => [
            "product_name" =>  "Product 2",
          ]
        ]
      ]
    ]

我已經嘗試了各種 foreach 循環,但我無法找到一種方法來像我上面的所需輸出那樣正確設置索引。

我試過的:

我最初也在研究這種方法,它更有效,因為它執行的查詢更少並提高了性能。 希望這對將來的人有所幫助。

  $variables = [];

  foreach($query_results as $key => $group) {
    $sub_groups = $this->db->select('*')
    ->from('products')
    ->where('parent_id', $group['id'])
    ->get();

    $variables[0]['product'][$key]['product_group'] = $group['product_name'];
    $variables[0]['product'][$key]['product_info']  = array_values($sub_groups->result_array());
  }

這將返回我上面想要的數組結構類型,但具有更好的性能。

您可以使用array_reduce來實現這一點。

$products = array(
    'product' => array(
      array(
        "product_parent" =>  "Parent Name 1",
        "product_name" =>  "Product 1",
      ),
      array(
        "product_parent" =>  "Parent Name 1",
        "product_name" =>  "Product 2",
      ),
      array(
        "product_parent" =>  "Parent Name 2",
        "product_name" =>  "Product 1",
      ),
      array(
        "product_parent" =>  "Parent Name 3",
        "product_name" =>  "Product 1",
      )
    )
);

//
$result = array_reduce($products['product'], function($c, $v){
    if ( !isset( $c[ $v['product_parent'] ] ) ) $c[ $v['product_parent'] ] = array( 'product_name' => $v[ "product_parent" ], 'product_info' => array() );
    $c[ $v['product_parent'] ]["product_info"][] = array( "product_name" => $v[ "product_name" ] );     
    return $c;
}, array());

//Constructing the final array
$result = array( 'product' => array_values( $result ) );


echo "<pre>";
print_r( $result );
echo "</pre>";

這將導致:

Array
(
    [product] => Array
        (
            [0] => Array
                (
                    [product_name] => Parent Name 1
                    [product_info] => Array
                        (
                            [0] => Array
                                (
                                    [product_name] => Product 1
                                )

                            [1] => Array
                                (
                                    [product_name] => Product 2
                                )

                        )

                )

            [1] => Array
                (
                    [product_name] => Parent Name 2
                    [product_info] => Array
                        (
                            [0] => Array
                                (
                                    [product_name] => Product 1
                                )

                        )

                )

            [2] => Array
                (
                    [product_name] => Parent Name 3
                    [product_info] => Array
                        (
                            [0] => Array
                                (
                                    [product_name] => Product 1
                                )

                        )

                )

        )

)

文檔: http : //php.net/manual/en/function.array-reduce.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM