laravel collection删除项目

时间:2018-01-29 12:17:17

标签: laravel laravel-5 laravel-collection

我有以下收藏

     Collection {#430 ▼
  #items: array:54 [▼
    0 => {#435 ▼
      +"name": "Persona 5"
      +"cover": "cover_persona-5_playstation-3.png"
      +"bio": "This is a syno"
      +"all_nb_rank": null
      +"platform_name": "Sony Playstation 3"
      +"tag_name": "RPG"
      +"developper": "Deep Silver"
      +"publisher": "Atlus"
    }
    1 => {#437 ▼
      +"name": "Persona 5"
      +"cover": "cover_persona-5_playstation-3.png"
      +"bio": "This is a syno"
      +"all_nb_rank": null
      +"platform_name": "Sony Playstation 3"
      +"tag_name": "Turn based"
      +"developper": "Deep Silver"
      +"publisher": "Atlus"
    }
    2 => {#436 ▼
      +"name": "Persona 5"
      +"cover": "cover_persona-5_playstation-3.png"
      +"bio": "This is a syno"
      +"all_nb_rank": null
      +"platform_name": "Sony Playstation 3"
      +"tag_name": "Simulation"
      +"developper": "Deep Silver"
      +"publisher": "Atlus"
    }
//

我想进入另一个集合“tag_name”行,然后从主集合中删除它,并删除重复值以获得类似这样的内容:

     Collection {#430 ▼
  #items: array:1 [▼
    0 => {#435 ▼
      +"name": "Persona 5"
      +"cover": "cover_persona-5_playstation-3.png"
      +"bio": "This is a syno"
      +"all_nb_rank": null
      +"platform_name": "Sony Playstation 3"
      +"developper": "Deep Silver"
      +"publisher": "Atlus"
    }

    Collection {#490 ▼
  #items: array:3 [▼
    0 => "RPG"
    1 => "Turn based"
    2 => "Simulation"
  ]
}

我已经设法通过

将“tag_name”行放到另一个Collection中
$tags = $collection->pluck('tag_name');

我还计划使用unique()集合方法来合并重复值。

但我不知道如何处理以从主集合中删除“tag_name”。

我尝试使用forget()和slice()方法,但它不起作用。我知道我可以把它变成一个简单的数组,然后使用PHP unset()函数,但我想知道如何使用Laravel Collection方法做到这一点

4 个答案:

答案 0 :(得分:0)

您可以使用forget()做一个小技巧,因为forget()仅适用于集合对象。

$collections = $collections->map(function ($c) {
    return collect($c)->forget('tag_name');
});
return $collections;

答案 1 :(得分:0)

分区方法可用于根据真实测试的逻辑将集合分成一个或多个集合。将它与list方法一起使用,如下例所示:

https://laravel.com/docs/5.5/collections#method-partition

另一个选项是mapToGroups方法。

https://laravel.com/docs/5.5/collections#method-maptogroups

答案 2 :(得分:0)

变异收集,我认为是一种不好的做法。您从上面的收藏中需要什么样的数据?如果您想要一个包含被拒绝数据的新集合。然后拒绝可能是一个解决方案。

Reject

答案 3 :(得分:-1)

except()方法正是您所需要的。它从集合中删除一个或多个键:

$persona = collect([     
    'name' => 'Persona 5',
    'cover' => 'cover_persona-5_playstation-3.png',
    'bio' => 'This is a syno',
    'all_nb_rank": nul',
    'platform_name' => 'Sony Playstation 3',
    'tag_name' => 'RPG',
    'developper' => 'Deep Silver',
    'publisher' => 'Atlus'
]);

$result = $persona->except(['tag_name']);

$personasWithOutTagName = $personas->except(['tag_name']);

这将导致:

[
    'name' => 'Persona 5',
    'cover' => 'cover_persona-5_playstation-3.png',
    'bio' => 'This is a syno',
    'all_nb_rank": nul',
    'platform_name' => 'Sony Playstation 3',
    'developper' => 'Deep Silver',
    'publisher' => 'Atlus'
];

对角色集合中的所有项目执行此操作,您可以执行以下操作:

$result = $personas->map(function ($person) {
    return collect($person)->except(['tag_name'])->all();
});

$result将是除tag_name键以外的所有角色的集合。