dongya1228 2018-02-22 14:37
浏览 25
已采纳

父组下的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.

  • 写回答

1条回答 默认 最新

  • douzi4724 2018-02-22 14:50
    关注

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 硬盘识别不了,需要初始化,可我的数据怎么办
  • ¥15 lvm2被mask了,怎么unmask都没用(标签-ubuntu|关键词-apt)
  • ¥15 交叉注意力机制的残差问题
  • ¥15 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?
  • ¥20 小规模孤立词识别系统设计
  • ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
  • ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出
  • ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
  • ¥20 求一个简易射频信号综测仪