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

Laravel中如何将两个不同长度的数组合并为含缺勤、请假统计的新数组

实现方案

方案1:优化SQL查询(更推荐,仅需一次数据库请求)

两个查询逻辑高度相似,仅vacs字段筛选条件不同,可以直接通过条件聚合一次拿到目标结果,无需后续二次处理:

$statistics = Absence::query()
    ->select('name')
    ->selectRaw("SUM(CASE WHEN vacs = 'No' THEN 1 ELSE 0 END) as abs_counts")
    ->selectRaw("SUM(CASE WHEN vacs = 'yes' THEN 1 ELSE 0 END) as vac_counts")
    ->whereBetween('date', [$req->from, $req->to])
    ->where('stage', $req->stage)
    ->where('group', $req->group)
    ->where('subject', $req->subject)
    ->groupBy('name')
    ->get();

直接输出的$statistics就和你期望的格式完全一致。

方案2:合并已有的两个查询结果

如果不想修改原有查询逻辑,可以用Laravel集合的内置方法快速合并处理:

// 分别将两个统计结果转为以姓名为键的映射结构
$absMap = $absences->keyBy('name');
$vacMap = $vacs->keyBy('name');

// 收集所有出现过的姓名(自动去重)
$allNames = $absMap->merge($vacMap)->keys();

// 遍历生成最终统计数组
$finalResult = $allNames->map(function ($name) use ($absMap, $vacMap) {
    return [
        'name' => $name,
        'abs_counts' => $absMap->get($name)?->counts ?? 0,
        'vac_counts' => $vacMap->get($name)?->counts ?? 0,
    ];
})->values()->toArray();

如果你的PHP版本低于8.0不支持空安全运算符?->,可以把对应行改为:

'abs_counts' => isset($absMap[$name]) ? $absMap[$name]->counts : 0,
'vac_counts' => isset($vacMap[$name]) ? $vacMap[$name]->counts : 0,

内容的提问来源于stack exchange,提问作者Sermed mayi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:15:03