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);
逻辑说明
- 独立数组初始化:每个疾病第一次出现时,复制
$monthTemplate作为自己的统计数组,避免共享引用导致的叠加问题。 - 高效统计:仅需一次遍历,直接定位目标疾病的对应月份进行计数,无需嵌套遍历所有月份。
- 简洁清晰:去掉冗余变量和循环,逻辑直白易懂。
期望的正确结果
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
相关产品推荐
相关产品推荐

