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 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 vue2登录调用后端接口如何实现