将两个查询结果,根据某个字段合并,有什么更优雅的方式么

我现在的做法是这样的,定义了两个数组模拟模型查询结果

$counts=collect([['id'=>2,'count'=>10],['id'=>3,'count'=>15]]);
$names=collect([['id'=>1,'name'=>'张三'],['id'=>2,'name'=>'李四'],['id'=>3,'name'=>'王五']]);

/** 根据 KEY字段 合并两个集合
* @param {*} $key 字段名
* @param {*} $collect1 集合1,完全保留
* @param {*} $collect2 集合2,仅保留集合1中有该KEY的元素
* @return {*} 合并后结果
*/
function CollectMerge($key,$collect1,$collect2)
{
    $arr1=$collect1->keyBy($key)->toArray();
    $arr2=$collect2->keyBy($key)->toArray();

    $result=array_map(function($item) use($arr2,$key){
        return array_merge($item,$arr2[$item[$key]]);
    },$arr1);

    return array_values($result);
}

dd(CollectMerge('id',$counts,$names));

打印结果

array:2 [
  0 => array:3 [
    "id" => 2
    "count" => 10
    "name" => "李四"
  ]
  1 => array:3 [
    "id" => 3
    "count" => 15
    "name" => "王五"
  ]
]

该方法虽然有效,但总感觉不是最优解,希望大佬们给指正下

做个俗人,无欲无求,安稳自由
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 8
cnguu

连表查询

1年前 评论
wanglong126 (楼主) 1年前
cnguu (作者) 1年前
wanglong126 (楼主) 1年前

这样效果好像也一样

file

1年前 评论
wanglong126 (楼主) 1年前
<?php

$counts = [['id' => 2, 'count' => 10], ['id' => 3, 'count' => 15]];
$names = [['id' => 1, 'name' => '张三'], ['id' => 2, 'name' => '李四'], ['id' => 3, 'name' => '王五']];

$countMap = array_column($counts, 'count', 'id');
$names = array_map(function ($item) use ($countMap) {
    $item['count'] = $countMap[$item['id']] ?? 0;
    return $item;
}, $names);

print_r($names);
1年前 评论
wanglong126 (楼主) 1年前

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