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 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了