如何在PHP中对数组值分组计数并生成Highcharts所需数据?
高效处理伙伴EDR状态统计,生成Highcharts所需数组
核心思路
一次性遍历原始数组完成状态计数,再按固定伙伴顺序生成目标数组,避免多次遍历提升效率,同时严格保证结果数组的伙伴顺序与需求一致。
实现步骤
- 先明确23个伙伴的固定顺序列表(比如业务要求排序的伙伴ID/名称数组)
- 遍历一次原始数据,用关联数组存储每个伙伴的三种状态计数
- 按固定顺序遍历伙伴列表,从统计结果中取出对应状态的数量(无数据则补0),生成三个目标数组
代码示例
// 替换为你实际的23个伙伴固定顺序列表(用伙伴ID或名称均可) $partner_order = ['partner_01', 'partner_02', 'partner_03', ..., 'partner_23']; // 初始化统计容器,确保每个伙伴的三种状态初始计数为0 $status_counter = []; foreach ($partner_order as $partner) { $status_counter[$partner] = [ 'ACHIEVED' => 0, 'ONGOING' => 0, 'NOTACHIEVED' => 0 ]; } // 遍历原始数组一次,完成所有状态计数 foreach ($partners_edr_data as $record) { $current_partner = $record['partner_id']; // 替换为实际的伙伴标识字段名 $current_status = $record['edr_status']; // 仅处理在固定列表内的伙伴和合法状态 if (isset($status_counter[$current_partner]) && in_array($current_status, ['ACHIEVED', 'ONGOING', 'NOTACHIEVED'])) { $status_counter[$current_partner][$current_status]++; } } // 生成Highcharts所需的三个数组 $achieved_list = []; $ongoing_list = []; $not_achieved_list = []; foreach ($partner_order as $partner) { $achieved_list[] = $status_counter[$partner]['ACHIEVED']; $ongoing_list[] = $status_counter[$partner]['ONGOING']; $not_achieved_list[] = $status_counter[$partner]['NOTACHIEVED']; } // 此时三个数组已按固定伙伴顺序排列,可直接传入Highcharts配置
关键说明
- 仅遍历原始数据一次,相比多次遍历的方式效率提升明显,数据量越大优势越突出
- 初始化阶段给所有伙伴的状态设为0,避免出现未统计到的伙伴在结果数组中缺失值的问题
- 完全依赖
$partner_order的顺序生成结果,确保与Highcharts的X轴伙伴顺序严格匹配
内容的提问来源于stack exchange,提问作者Candra Sihombing
相关产品推荐
相关产品推荐

