父组下的PHP组数组子项?

时间:2018-02-22 14:37:49

标签: php arrays

我有一个返回以下内容的数组:

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

这将返回上面我想要的数组结构类型,但具有更好的性能。

1 个答案:

答案 0 :(得分:1)

您可以使用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
                                )

                        )

                )

        )

)

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