【问题标题】:Laravel Combine or Merge objects of two Collection in straight wayLaravel 直接合并或合并两个集合的对象
【发布时间】:2021-04-16 20:08:56
【问题描述】:
$user = collect(["name"=>"sam","age"=>20],["name"=>"john","age"=>21],["name"=>"roz","age"=>19]);

$car = collect(["name"=>"sam","car"=>"BMW"],["name"=>"john","car"=>"Audi"],["name"=>"roz","car"=>"Ford"]);

我想合并或组合这两个集合并得到这样的输出:

$collection = (["name"=>"sam","age"=>20,"car"=>"BMW"],["name"=>"john","age"=>21,"car"=>"Audi"],["name"=>"roz","age"=>19,"car"=>"Ford"])

感谢您的支持。

【问题讨论】:

  • 您对此有何疑问?

标签: php arrays laravel foreach collections


【解决方案1】:
$users = collect([["name"=>"sam","age"=>20],["name"=>"john","age"=>21],["name"=>"roz","age"=>19]]);
$cars = collect([["name"=>"sam","car"=>"BMW"],["name"=>"john","car"=>"Audi"],["name"=>"roz","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 方法的方式不会给您想要的,您需要像上面的代码一样将整个包装在一个数组中。

【讨论】:

    【解决方案2】:

    如果集合是有序集合,您可以遍历其中一个并排列数据:

    /**
     * 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"=>20],
            ["name"=>"john", "age"=>21],
            ["name"=>"roz", "age"=>19]
        ]);
        $cars = collect([
            ["name"=>"sam", "car"=>"BMW"],
            ["name"=>"john", "car"=>"Audi"],
            ["name"=>"roz", "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'],
                'age' => $user['age'],
                'car' => $users_cars[$user['name']]['car'],
            ];
        }
    
        return collect($result);
    }
    
    function getData()
    {
        $users = collect([
            ["name"=>"sam", "age"=>20],
            ["name"=>"john", "age"=>21],
            ["name"=>"roz", "age"=>19]
        ]);
        $cars = collect([
            ["name"=>"sam", "car"=>"BMW"],
            ["name"=>"john", "car"=>"Audi"],
            ["name"=>"roz", "car"=>"Ford"]
        ]);
    
        $merged_data = mergeUserCollections($users, $cars);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2017-10-05
      • 2019-12-01
      • 2017-07-21
      • 1970-01-01
      • 2017-03-23
      相关资源
      最近更新 更多