父组下的PHP组数组子项?

I have an array that returns the following:

   $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",
      ]
    ]
  ];

I need to return a new array that is structured like this that is an (indexed) array of (associative) arrays

   '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",
          ]
        ]
      ]
    ]

I've tried various foreach loops but I can't figure out a way to get the index set properly like the desired output I have above.

What I've Tried:

I also was originally working on this method, which is more efficient as it does less queries and improves performance. Hopefully this helps someone in the future.

  $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());
  }

This will return the type of array structure I desired above, but with better performance.

You can use array_reduce to achieve this.

$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>";

This will result to:

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
                                )

                        )

                )

        )

)

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