如何对PHP数组中对象的动态键值求和并排除固定键?
解决PHP中仅对关联数组数字键值求和并生成累计total的问题
你的核心问题是需要排除每个子数组中的timeSummary字符串键,仅对数字键对应的值求和,再累加得到累计的total。以下是两种可行的解决方案:
方法一:移除固定非目标键后求和
直接复制子数组并移除已知的timeSummary键,再对剩余元素求和,逻辑简单直接:
$obj1 = [ "101" => 18, "102" => 15, "103" => 23, "timeSummary" => "2023-04-17 00:00:00" ]; $obj2 = [ "101" => 15, "102" => 13, "103" => 79, "timeSummary" => "2023-04-18 00:00:00" ]; $obj3 = [ "101" => 50, "102" => 50, "103" => 62, "timeSummary" => "2023-04-19 00:00:00" ]; $testArray = [$obj1, $obj2, $obj3]; $withTotal = []; $total = 0; foreach ($testArray as $item) { // 复制当前子数组并移除timeSummary键 $numericData = $item; unset($numericData['timeSummary']); // 计算当前子数组的数字键总和 $currentSum = array_sum($numericData); // 累加累计total $total += $currentSum; // 为当前子数组添加累计total后存入结果数组 $item['total'] = $total; $withTotal[] = $item; } // 输出结果查看 print_r($withTotal);
方法二:过滤数字键后求和
如果后续可能出现其他非数字键,用array_filter结合键过滤的方式更灵活,自动保留所有数字类型的键:
$withTotal = []; $total = 0; foreach ($testArray as $item) { // 过滤出键为数字的元素 $numericItems = array_filter($item, function($key) { return is_numeric($key); }, ARRAY_FILTER_USE_KEY); $currentSum = array_sum($numericItems); $total += $currentSum; $item['total'] = $total; $withTotal[] = $item; }
说明你之前的错误方法无效的原因
你尝试的if (!$withTotal[$key]['timeSummary'])逻辑完全错误:这个判断是在检查timeSummary的值是否为空,但你的timeSummary都有有效的日期字符串,条件永远不成立,导致根本没有执行求和操作,自然得不到正确结果。
内容的提问来源于stack exchange,提问作者Grasper
相关产品推荐
相关产品推荐

