Laravel 以直接方式组合或合并两个 Collection 的对象

问题描述

$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);
}