如何组装数据?

有以下三个数组

// users
array:2 [
  0 => array:4 [
    "id" => 1
    "name" => "xxx"
  ]
  1 => array:4 [
    "id" => 2
    "name" => "yyy"
  ]
]
// articles
array:2 [
  0 => {#1660
    +"id": 1
    +"sub_num": 1
  }
  1 => {#1665
    +"id": 2
    +"sub_num": 2
  }
]

// articles
array:2 [
  0 => {#1660
    +"id": 1
    +"week_num": 1
  }
  1 => {#1665
    +"id": 2
    +"week_num": 2
  }
]

期待结果如下

[
    ['id' => 1, 'sub_num' => 1, "week_num" => 1],
    ['id' => 2, 'sub_num' => 1, "week_num" => 2],
]

根据第一个数组的id为主,怎么组合成如上一个数组

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
    public function arrays_merge_demo(){
        $users=[
            [
                "id" => 1,
                "name" => "xxx"
            ],[
                "id" => 2,
                "name" => "yyy"
            ]
        ];
        $articles1=[
            [
                "id"=> 1,
                "sub_num"=> 1
            ],[
                "id"=> 2,
                "sub_num"=> 2
            ]
        ];

        $articles2=[
            [
                "id"=> 1,
                "week_num"=> 1
            ],[
                "id"=> 2,
                "week_num"=> 2
            ]
        ];
        $this->arrays_merge($users,$articles1,$articles2);
        echo json_encode($users,JSON_PRETTY_PRINT);
    }

    private function arrays_merge(&$array,...$arrays){
        $pointers=[];
        foreach ($array as &$item){
            $pointers[$item['id']]=&$item;
        }
        unset($item);
        foreach ($arrays as $sub){//这里是因为有两个$articles,实际无循环嵌套
            foreach ($sub as $item){
                $pointers[$item['id']]=array_merge($pointers[$item['id']],$item);
            }
        }
    }

result:


[
    {
        "id": 1,
        "name": "xxx",
        "sub_num": 1,
        "week_num": 1
    },
    {
        "id": 2,
        "name": "yyy",
        "sub_num": 2,
        "week_num": 2
    }
]
1年前 评论
cccyzloong (楼主) 1年前
讨论数量: 10

file

file

file 最简单的就是这样,循环里套两个循环,你上面article是subclass 要用箭头

1年前 评论
cccyzloong (楼主) 1年前
oceanjiayu (作者) 1年前

oceanjiayu 的方案是 M*N 的复杂度,M 是 users 的个数, N 是 article1 和 article 2 的较大的个数 zhaojjiang 的方案是 M + N1 + N2 + M 的复杂度 然后你根据数据量取舍咯 ~

1年前 评论
cccyzloong (楼主) 1年前

首先 为什么有两个 articles,如果数据表就是如此,查询就应该一次查出来,不要查两次,其次你上面提到数据多的问题,数据库基本就过滤了,不存在这个问题,循环解决,先能实现即可,再考虑优化的问题。

1年前 评论
cccyzloong (楼主) 1年前
Adachi (作者) 1年前
    public function arrays_merge_demo(){
        $users=[
            [
                "id" => 1,
                "name" => "xxx"
            ],[
                "id" => 2,
                "name" => "yyy"
            ]
        ];
        $articles1=[
            [
                "id"=> 1,
                "sub_num"=> 1
            ],[
                "id"=> 2,
                "sub_num"=> 2
            ]
        ];

        $articles2=[
            [
                "id"=> 1,
                "week_num"=> 1
            ],[
                "id"=> 2,
                "week_num"=> 2
            ]
        ];
        $this->arrays_merge($users,$articles1,$articles2);
        echo json_encode($users,JSON_PRETTY_PRINT);
    }

    private function arrays_merge(&$array,...$arrays){
        $pointers=[];
        foreach ($array as &$item){
            $pointers[$item['id']]=&$item;
        }
        unset($item);
        foreach ($arrays as $sub){//这里是因为有两个$articles,实际无循环嵌套
            foreach ($sub as $item){
                $pointers[$item['id']]=array_merge($pointers[$item['id']],$item);
            }
        }
    }

result:


[
    {
        "id": 1,
        "name": "xxx",
        "sub_num": 1,
        "week_num": 1
    },
    {
        "id": 2,
        "name": "yyy",
        "sub_num": 2,
        "week_num": 2
    }
]
1年前 评论
cccyzloong (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!