如何按类别循环数组数据并统计各类别金额总和
按类别统计金额总和的PHP实现方案
问题说明
现有一个包含序号、类别、描述、金额的数组,需要按类别分组展示数据,并统计每个类别的金额总和。当前已实现分组展示功能,但缺少金额求和逻辑。
原始数组
$arr = [ [1, "Category 1", "Desc 1", 10000], [2, "Category 1", "Desc 2", 5000], [3, "Category 1", "Desc 3", 2500], [4, "Category 1", "Desc 4", 3000], [5, "Category 1", "Desc 5", 15000], [1, "Category 2", "Ket 1", 10000], [2, "Category 2", "Ket 2", 5000], [3, "Category 2", "Ket 3", 2500], [1, "Category 3", "Kata 1", 3000], [2, "Category 3", "Kata 2", 15000], ];
期望输出
Category 1 1. Desc 1 - 10000 2. Desc 2 - 5000 3. Desc 3 - 2500 4. Desc 4 - 3000 5. Desc 5 - 15000 Total = 35500 Category 2 1. Ket 1 - 10000 2. Ket 2 - 5000 3. Ket 3 - 2500 Total = 17500 Category 3 1. Kata 1 - 3000 2. Kata 2 - 15000 Total = 18000
现有实现代码
$array = [ [1, "Category 1", "Desc 1", 10000], [2, "Category 1", "Desc 2", 5000], [3, "Category 1", "Desc 3", 2500], [4, "Category 1", "Desc 4", 3000], [5, "Category 1", "Desc 5", 15000], [1, "Category 2", "Ket 1", 10000], [2, "Category 2", "Ket 2", 5000], [3, "Category 2", "Ket 3", 2500], [1, "Category 3", "Kata 1", 3000], [2, "Category 3", "Kata 2", 15000], ]; $cat = ''; $x = 0; foreach ($array as $key => $data) { if ($data[1] != $cat) { echo $data[1] . PHP_EOL; $cat = $data[1]; } echo $data[0] . ". " . $data[2] . " - " . $data[3] . PHP_EOL; }
解决方案
方案一:在原遍历逻辑中增加求和
直接修改现有代码,通过维护总和变量,在类别切换时输出上一个类别的总和,最后处理最后一个类别的统计:
$array = [ [1, "Category 1", "Desc 1", 10000], [2, "Category 1", "Desc 2", 5000], [3, "Category 1", "Desc 3", 2500], [4, "Category 1", "Desc 4", 3000], [5, "Category 1", "Desc 5", 15000], [1, "Category 2", "Ket 1", 10000], [2, "Category 2", "Ket 2", 5000], [3, "Category 2", "Ket 3", 2500], [1, "Category 3", "Kata 1", 3000], [2, "Category 3", "Kata 2", 15000], ]; $cat = ''; $total = 0; foreach ($array as $key => $data) { // 类别切换时,输出上一个类别的总和(首次循环跳过) if ($data[1] != $cat) { if ($cat !== '') { echo "Total = " . $total . PHP_EOL . PHP_EOL; } echo $data[1] . PHP_EOL; $cat = $data[1]; $total = 0; // 重置当前类别总和 } echo $data[0] . ". " . $data[2] . " - " . $data[3] . PHP_EOL; $total += $data[3]; // 累加当前项金额 } // 输出最后一个类别的总和 echo "Total = " . $total . PHP_EOL;
方案二:先分组再统计(更清晰)
先将数组按类别分组,再遍历分组数据进行展示和求和,逻辑更直观,适合后续复用分组数据的场景:
$array = [ [1, "Category 1", "Desc 1", 10000], [2, "Category 1", "Desc 2", 5000], [3, "Category 1", "Desc 3", 2500], [4, "Category 1", "Desc 4", 3000], [5, "Category 1", "Desc 5", 15000], [1, "Category 2", "Ket 1", 10000], [2, "Category 2", "Ket 2", 5000], [3, "Category 2", "Ket 3", 2500], [1, "Category 3", "Kata 1", 3000], [2, "Category 3", "Kata 2", 15000], ]; // 按类别分组 $grouped = []; foreach ($array as $item) { $category = $item[1]; if (!isset($grouped[$category])) { $grouped[$category] = []; } $grouped[$category][] = $item; } // 遍历分组数据,输出并统计总和 foreach ($grouped as $category => $items) { echo $category . PHP_EOL; $total = 0; foreach ($items as $item) { echo $item[0] . ". " . $item[2] . " - " . $item[3] . PHP_EOL; $total += $item[3]; } echo "Total = " . $total . PHP_EOL . PHP_EOL; }
内容的提问来源于stack exchange,提问作者Arny
相关产品推荐
相关产品推荐

