Laravel集合数组中统计指定数据出现次数的技术问询
解决Laravel集合中指定数据的统计问题
首先咱们得理清问题根源:你用pluck('listdata')拿到的是包含所有listdata字段值的集合,但contains()只是判断集合里是否存在目标值,而count('Test')并不是统计出现次数——Laravel的count()方法不传参数返回集合总数,传参数其实是检查元素是否存在(返回1或0),这就是你得到总数而非预期统计数的原因。
下面根据listdata的存储类型,给出两种常见场景的解决方案:
场景1:listdata是单个字符串类型
如果每个listdata都是独立的字符串(比如直接存的'Test'、'Test child 1'),用Laravel集合自带的countBy()方法就能直接实现你的需求,它会自动统计集合中每个值的出现次数:
public function getdiagnosistally(){ $jsonData = ListBuilder::all()->pluck('listdata'); // 一键统计所有值的出现次数 $counts = $jsonData->countBy(); dd($jsonData, $counts); }
执行后$counts会是类似这样的集合:
Illuminate\Support\Collection {#345 #items: array:2 [ "Test" => 2 "Test child 1" => 4 ] }
要是你只想统计特定几个值,比如只看'Test'和'Test child 1',可以在统计后筛选:
$targetCounts = $counts->only(['Test', 'Test child 1']);
场景2:listdata是数组/JSON字符串类型
如果listdata存的是数组(或者数据库里是JSON格式的字符串),需要先把所有嵌套的数组展开成一维集合,再统计:
先处理JSON字符串转数组(如果需要)
如果数据库里listdata是JSON字符串,先在ListBuilder模型里设置自动转换:
class ListBuilder extends Model { protected $casts = [ 'listdata' => 'array', // 自动把数据库的JSON字符串转成数组 ]; }
展开数组并统计
public function getdiagnosistally(){ $jsonData = ListBuilder::all()->pluck('listdata'); // 把所有嵌套数组展开成一维集合,再统计 $counts = $jsonData->flatMap(function($item) { return $item; // flatMap会把每个数组拆成单个元素 })->countBy(); dd($jsonData, $counts); }
这样就能把所有分散在数组里的元素都统计到。
内容的提问来源于stack exchange,提问作者Metono
相关产品推荐
相关产品推荐

