问题描述
$user = collect(["name"=>"sam","age"=>20],["name"=>"john","age"=>21],["name"=>"roz","age"=>19]);
$car = collect(["name"=>"sam","car"=>"BMW"],"car"=>"Audi"],"car"=>"Ford"]);
我想合并或组合这两个集合并获得如下输出:
$collection = (["name"=>"sam","age"=>20,"age"=>21,"age"=>19,"car"=>"Ford"])
感谢您的支持。
解决方法
$users = collect([["name"=>"sam","age"=>20],["name"=>"john","age"=>21],["name"=>"roz","age"=>19]]);
$cars = collect([["name"=>"sam","car"=>"BMW"],"car"=>"Audi"],"car"=>"Ford"]]);
return $users->map(function ($item) use ($cars) {
$car = $cars->first(fn ($value)=> $value['name'] === $item['name']);
$item['car'] = $car['car'];
return $item;
})->all();
注意:您使用 collect
方法的方式不会给您想要的东西,您需要像上面的代码一样将整个包裹在一个数组中。
如果集合是有序集合,您可以循环遍历其中之一并排列您的数据:
/**
* Merging the user and the car collections
*
* @param Collection $users
* @param Collection $cars
*
* @return Collection
*/
function mergeUserCollections(Collection $users,Collection $cars): Collection
{
$result = [];
foreach ($users as $index => $user) {
$result[] = [
'name' => $user['name'],'age' => $user['age'],'car' => $cars[$index]['car'],];
}
return collect($result);
}
function getData()
{
$users = collect([
["name"=>"sam","age"=>19]
]);
$cars = collect([
["name"=>"sam","car"=>"Ford"]
]);
$merged_data = mergeUserCollections($users,$cars);
}
如果不是,则按带有名称的汽车集合分组:
/**
* Merging the user and the car collections
*
* @param Collection $users
* @param Collection $cars
*
* @return Collection
*/
function mergeUserCollections(Collection $users,Collection $cars): Collection
{
$result = [];
$users_cars = $cars->keyBy('name');
foreach ($users as $index => $user) {
$result[] = [
'name' => $user['name'],'car' => $users_cars[$user['name']]['car'],];
}
return collect($result);
}
function getData()
{
$users = collect([
["name"=>"sam",$cars);
}