PHP中遍历数组统计元素的方法?现有代码计数异常求助
PHP数组按供应商+品牌统计数量的问题解决
问题描述
想要在PHP中遍历数组,按provider->name和product->brand->name分组统计元素数量,尝试了以下代码:
foreach ($items as $item) { $tm[$item->provider->name] = []; foreach ($items as $item) { $tm[$item->provider->name][$item->product->brand->name] = isset($tm[$item->provider->name][$item->product->brand->name]) ? $tm[$item->provider->name][$item->product->brand->name] + 1 : $tm[$item->provider->name][$item->product->brand->name] = 1; } }
但得到错误结果,计数数值极高,像是被重复遍历了多次。
数组结构示例:
[{ "id": 1, "product": { "id": 1, "brand": { "id": 1, "name": "iphone" } }, "provider": { "id": 1, "name": "at&t" } }, { "id": 2, "product": { "id": 2, "brand": { "id": 2, "name": "iphone" } }, "provider": { "id": 1, "name": "at&t" } }, { "id": 3, "product": { "id": 3, "brand": { "id": 3, "name": "iphone" } }, "provider": { "id": 1, "name": "t-mobile" } }]
错误原因
你的代码嵌套了两层遍历同一个$items数组的循环:
- 外层循环每遍历一个元素,就会把
$tm[$item->provider->name]重置为空数组 - 接着内层循环会完整遍历所有元素一次,对每个供应商的品牌计数进行累加
- 假设
$items有N个元素,每个元素会被重复统计N次,最终计数就是实际数量的N倍,所以数值异常高
正确代码
只需要一层循环即可完成统计,避免重复遍历:
$tm = []; foreach ($items as $item) { $providerName = $item->provider->name; $brandName = $item->product->brand->name; // 初始化供应商分组(如果不存在) if (!isset($tm[$providerName])) { $tm[$providerName] = []; } // 统计品牌数量 if (isset($tm[$providerName][$brandName])) { $tm[$providerName][$brandName]++; } else { $tm[$providerName][$brandName] = 1; } }
代码说明
- 先初始化空数组
$tm用于存储统计结果 - 遍历每个元素时,先提取当前元素的供应商名和品牌名,提升代码可读性
- 检查供应商分组是否存在,不存在则创建空数组
- 对应品牌的计数:存在则加1,不存在则设为1
- 最终
$tm会得到按供应商分组,每个供应商下各品牌的正确统计数量
内容的提问来源于stack exchange,提问作者plasticheart
相关产品推荐
相关产品推荐

