PHP动态数组统计相同status值并重构数组的实现问询
解决动态数组的状态统计与格式重构问题
嘿,我来帮你搞定这个统计需求!你的现有代码已经有了统计的雏形,但有点不够灵活,而且还没完成最后格式转换的步骤。我给你两种方案,一种是基于你现有代码的快速改进,另一种是更通用的灵活方案。
方案一:基于你现有代码的快速改进
你已经手动统计了三种状态的数量,只需要在最后把这些统计值转换成你想要的数组格式就行:
public function getData(){ $key_idle = 0; $key_busy = 0; $key_overload = 0; $data = $this->queries_trend->getDataCustomer(); foreach ($data as $key => $value) { $val = $value['status']; if ($val == 'Idle') { $key_idle++; } elseif ($val == 'Busy') { $key_busy++; } elseif ($val == 'Overload') { $key_overload++; } } // 组装成目标格式的数组 $result = []; if ($key_overload > 0) { $result[] = ['Overload' => (string)$key_overload]; } if ($key_idle > 0) { $result[] = ['Idle' => (string)$key_idle]; } if ($key_busy > 0) { $result[] = ['Busy' => (string)$key_busy]; } return $result; }
这个方案适合你确定只有这三种状态的场景,但如果以后新增了其他状态(比如"Offline"),你就得手动加变量和判断,不够灵活。
方案二:更灵活的动态统计方案
这种方法不用硬编码任何状态值,不管后续新增多少种status,代码都能自动统计,通用性更强:
public function getData(){ // 用一个数组来动态存储每个状态的计数 $statusCounts = []; $data = $this->queries_trend->getDataCustomer(); foreach ($data as $item) { $status = $item['status']; // 如果该状态还没被统计过,初始化为0 if (!isset($statusCounts[$status])) { $statusCounts[$status] = 0; } // 计数加1 $statusCounts[$status]++; } // 把统计结果转换成你需要的格式:每个状态是单独的数组元素 $result = []; foreach ($statusCounts as $status => $count) { // 这里如果不需要字符串类型的计数,去掉(string)即可 $result[] = [$status => (string)$count]; } return $result; }
为什么推荐这个方案?
- 灵活性高:新增任何status都不需要修改代码,自动适配
- 代码更简洁:不用维护一堆单独的计数变量
- 可扩展性强:后续如果需要扩展统计逻辑,只需要修改循环内的逻辑即可
测试一下的话,用你给出的示例数据,这个方法会生成完全符合你要求的数组:[{"Overload":"2"},{"Idle":"1"},{"Busy":"1"}]
内容的提问来源于stack exchange,提问作者tonjel
相关产品推荐
相关产品推荐

