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

PHP数组分组统计异常求助:按id_penyakit和月份独立统计数量

数组统计问题:按疾病ID和月份独立统计数量

问题背景

我正在进行课程期末测试,编写功能时卡在数组值统计环节。从MySQL获取数据后,需要将数据整理为新数组,按相同id_penyakit和创建月份统计数量,但当前代码导致各疾病的月份统计值累计叠加,无法独立统计。

获取数据的代码

$stmt = $conn->prepare("SELECT r.id,id_penyakit,nama_penyakit,id_puskesmas,nama_puskesmas,created_at FROM riwayat r WHERE id_puskesmas = :id_puskesmas");
$stmt->bindValue(':id_puskesmas', $page_cat);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$chartriwayat = $stmt->fetchAll();

原始数据数组

Array
(
    [0] => Array
        (
            [id] => 4
            [id_penyakit] => 1
            [nama_penyakit] => Ayan
            [id_puskesmas] => 5
            [nama_puskesmas] => Puskesmas Melur
            [created_at] => 2024-02-01 10:32:14
        )

    [1] => Array
        (
            [id] => 5
            [id_penyakit] => 2
            [nama_penyakit] => kutilan
            [id_puskesmas] => 5
            [nama_puskesmas] => Puskesmas Melur
            [created_at] => 2024-02-01 10:32:18
        )

    [2] => Array
        (
            [id] => 6
            [id_penyakit] => 3
            [nama_penyakit] => Panuan
            [id_puskesmas] => 5
            [nama_puskesmas] => Puskesmas Melur
            [created_at] => 2024-02-01 10:32:22
        )

    [3] => Array
        (
            [id] => 8
            [id_penyakit] => 3
            [nama_penyakit] => Panuan
            [id_puskesmas] => 5
            [nama_puskesmas] => Puskesmas Melur
            [created_at] => 2024-01-01 10:32:22
        )

    [4] => Array
        (
            [id] => 9
            [id_penyakit] => 3
            [nama_penyakit] => Panuan
            [id_puskesmas] => 5
            [nama_puskesmas] => Puskesmas Melur
            [created_at] => 2024-01-01 11:32:22
        )

)

尝试的代码

$arraychartriwayat1 = $arraychartriwayat2 = $arraychartriwayat = array();

$ArrayFuncmonth = array(
    'January'=>0, 
    'February'=>0, 
    'March'=>0, 
    'April'=>0, 
    'Mei'=>0, 
    'June'=>0, 
    'July'=>0, 
    'August'=>0, 
    'September'=>0, 
    'October'=>0, 
    'November'=>0, 
    'December'=>0
);

foreach ($chartriwayat as $key => $value) {
    $arraychartriwayat1[$value['id_penyakit']] = array(
        "name" => $value['nama_penyakit'],
        "data" => $ArrayFuncmonth,
    );
}

foreach ($chartriwayat as $key => $value) {
    $riwayatmonth = date('F', strtotime($value['created_at']));
    foreach ($ArrayFuncmonth as $ke => $va) {
        $month = $ke;
        if($riwayatmonth==$month){
            if(isset($ArrayFuncmonth[$ke])){
                $ArrayFuncmonth[$ke]+=1;
            }else{
                $ArrayFuncmonth[$ke]+=0;
            }
        }
        $arraychartriwayat[$value['id_penyakit']] = array(
            "name" => $value['nama_penyakit'],
            "data" => $ArrayFuncmonth,
        );
    }
}

问题分析

当前代码的核心问题是所有疾病共享了同一个$ArrayFuncmonth数组,初始化每个疾病的data时都指向这个数组的引用,后续修改数组值会同步影响所有疾病的统计结果,导致数据叠加。

解决方案

重新编写统计逻辑,确保每个疾病拥有独立的月份统计数组:

// 定义月份模板数组
$monthTemplate = [
    'January' => 0,
    'February' => 0,
    'March' => 0,
    'April' => 0,
    'Mei' => 0,
    'June' => 0,
    'July' => 0,
    'August' => 0,
    'September' => 0,
    'October' => 0,
    'November' => 0,
    'December' => 0
];

$result = [];

foreach ($chartriwayat as $item) {
    $diseaseId = $item['id_penyakit'];
    $diseaseName = $item['nama_penyakit'];
    $month = date('F', strtotime($item['created_at']));
    
    // 首次遇到该疾病时,初始化独立的统计数组
    if (!isset($result[$diseaseId])) {
        $result[$diseaseId] = [
            'name' => $diseaseName,
            'data' => $monthTemplate // 复制模板,每个疾病拥有独立数组
        ];
    }
    
    // 对应月份计数+1
    $result[$diseaseId]['data'][$month]++;
}

// 输出结果
print_r($result);

逻辑说明

  1. 独立数组初始化:每个疾病第一次出现时,复制$monthTemplate作为自己的统计数组,避免共享引用导致的叠加问题。
  2. 高效统计:仅需一次遍历,直接定位目标疾病的对应月份进行计数,无需嵌套遍历所有月份。
  3. 简洁清晰:去掉冗余变量和循环,逻辑直白易懂。

期望的正确结果

Array
(
    [1] => Array
        (
            [name] => Ayan
            [data] => Array
                (
                    [January] => 0
                    [February] => 1
                    [March] => 0
                    [April] => 0
                    [Mei] => 0
                    [June] => 0
                    [July] => 0
                    [August] => 0
                    [September] => 0
                    [October] => 0
                    [November] => 0
                    [December] => 0
                )

        )

    [2] => Array
        (
            [name] => kutilan
            [data] => Array
                (
                    [January] => 0
                    [February] => 1
                    [March] => 0
                    [April] => 0
                    [Mei] => 0
                    [June] => 0
                    [July] => 0
                    [August] => 0
                    [September] => 0
                    [October] => 0
                    [November] => 0
                    [December] => 0
                )

        )

    [3] => Array
        (
            [name] => Panuan
            [data] => Array
                (
                    [January] => 2
                    [February] => 1
                    [March] => 0
                    [April] => 0
                    [Mei] => 0
                    [June] => 0
                    [July] => 0
                    [August] => 0
                    [September] => 0
                    [October] => 0
                    [November] => 0
                    [December] => 0
                )

        )

)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:35:53