You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:46:19