Laravel使用sortBy处理含空数组的集合返回空数组如何解决
问题原因
当使用sortBy对包含空数组的集合按指定字段排序时,空数组不存在对应排序字段,Laravel会默认取null作为排序值。默认排序规则中null的排序优先级高于有效数值,因此空数组会被排在排序结果的最前面,最终调用first()就会拿到不符合预期的空数组。
解决方案
根据你的业务需求可以选择以下两种常用方案:
方案1:排序前过滤空数组(不需要保留空数组时首选,实现最简单)
调用filter()方法先移除集合中的空数组、null等空值元素,再执行排序:$first = []; $second = ['created_at'=>2]; $third= [$first , $second]; $res = collect($third)->filter()->sortBy('created_at')->first(); dd($res);方案2:自定义排序规则保留空数组(需要保留空数组仅调整排序顺序时使用)
给sortBy传入自定义回调,给不存在created_at字段的元素设置一个足够大的默认排序值,让空数组自动排在排序结果的末尾:$res = collect($third)->sortBy(function ($item) { return $item['created_at'] ?? PHP_INT_MAX; })->first();如果你希望空数组排在最前面仅要排除掉拿空的情况,调整为
$res = collect($third)->sortBy('created_at')->whereNotNull('created_at')->first();也可以实现。
内容的提问来源于stack exchange,提问作者Umer Fayyaz
相关产品推荐
相关产品推荐

