Laravel中pluck后用unique/filter索引数组变关联数组怎么办?
这不是Bug,是你对Collection方法的用法理解有偏差
首先明确:这完全不是Laravel的Bug,是因为你没注意到Collection方法调用后键的保留机制,以及unique()方法的正确用法。
为什么会变成关联数组?
当你用pluck('post_id')时,得到的是一个Collection,它的键是原posts集合的索引(比如0、1、2...),值是对应的post_id。当你调用unique()时,Collection会保留原有的键(只移除重复的值对应的条目),所以当你把这个Collection转成数组时,就会得到带有原键的关联数组,比如{"1":1,"2":2}。
另外你这里的unique('post_id')其实是多余的参数——因为pluck之后的Collection每个元素就是post_id本身,不需要指定字段,直接调用unique()就可以了。
解决方案:重置集合的键
要得到唯一值的索引数组,只需要在unique()之后调用values()方法,它会重置Collection的键为连续的数字索引,之后再转成数组就符合你的需求了:
$uniquePostIds = $this->posts->pluck('post_id')->unique()->values()->toArray();
这样返回的结果就是[1, 2]这样的索引数组。
更高效的方式:数据库层面去重
如果你的posts是Eloquent查询构建器的结果,还可以直接在数据库层面用distinct()去重,这样能减少内存消耗(不需要在PHP层面处理重复值):
$uniquePostIds = $this->posts->distinct()->pluck('post_id')->toArray();
这种方式得到的Collection本身就是索引化的,转成数组直接就是你想要的索引数组。
内容的提问来源于stack exchange,提问作者Hasan Teymoori
相关产品推荐
相关产品推荐

