如何对多维数组中的RESULT_VALUE求和并输出合并DESCR列表?
处理多维数组的RESULT_VALUE求和与DESCR列表合并
别慌,这种多层嵌套的数组确实容易让人头大,我来帮你拆解处理~先理清楚你的数组层级,再一步步实现求和和描述列表合并的需求。
先明确数组结构(基于你提供的片段补全)
你的数组大概是这样的PHP格式(方便后续代码示例):
$orders = [ [ 'ORDER_ID' => 35, 'DISCOUNT_ID' => 18, 'ORDER_COUPON_ID' => 0, 'COUPON_ID' => '', 'RESULT' => [ 'BASKET' => [ 617 => [ 'RULE_ID' => 248, 'APPLY' => 'Y', 'RULE_DESCR_ID' => 248, 'ACTION_BLOCK_LIST' => [0], 'DESCR_DATA' => [ [ 'TYPE' => 2, 'VALUE' => 10, 'VALUE_TYPE' => 'P', 'VALUE_ACTION' => 'D', 'RESULT_VALUE' => 229.905, 'RESULT_UNIT' => 'RUB' ] ] ] ] ] ], // 第二个商品/折扣的数组结构类似 ];
解决方案步骤
1. 初始化变量
先定义两个变量,分别存储RESULT_VALUE的总和,以及所有描述信息的列表:
$totalResultValue = 0.0; $descrList = [];
2. 逐层遍历数组求和并收集描述
因为数组有多层嵌套,我们需要一层一层遍历,同时加入安全判断避免报错:
foreach ($orders as $order) { // 先检查当前订单是否有BASKET数据,没有就跳过 if (!isset($order['RESULT']['BASKET']) || empty($order['RESULT']['BASKET'])) { continue; } // 遍历BASKET里的每个商品 foreach ($order['RESULT']['BASKET'] as $item) { // 检查商品是否有DESCR_DATA,没有就跳过 if (!isset($item['DESCR_DATA']) || empty($item['DESCR_DATA'])) { continue; } // 遍历每条折扣/价格描述数据 foreach ($item['DESCR_DATA'] as $descrItem) { // 累加RESULT_VALUE,转成浮点型确保计算准确 if (isset($descrItem['RESULT_VALUE'])) { $totalResultValue += (float)$descrItem['RESULT_VALUE']; } // 生成你需要的描述文本,格式可以根据需求调整 $descrText = sprintf( "折扣规则:类型%d,折扣值%d%s,操作类型%s,最终金额%.2f %s", $descrItem['TYPE'], $descrItem['VALUE'], $descrItem['VALUE_TYPE'] === 'P' ? '%' : '', // P对应百分比 $descrItem['VALUE_ACTION'] === 'D' ? '折扣' : '其他', // D对应折扣 $descrItem['RESULT_VALUE'], $descrItem['RESULT_UNIT'] ); $descrList[] = $descrText; } } }
3. 输出最终结果
最后把计算好的总和和描述列表输出:
// 输出总和,保留两位小数 echo "RESULT_VALUE总和:" . number_format($totalResultValue, 2) . " RUB\n"; // 输出合并后的描述列表 echo "\n合并后的DESCR列表:\n"; foreach ($descrList as $index => $descr) { echo ($index + 1) . ". " . $descr . "\n"; }
关键提示
- 加入
isset()和empty()判断是为了避免数组键不存在时触发报错,处理动态生成的数组时这一步很重要 - 描述文本的格式可以完全根据你的需求修改,比如只提取
VALUE和RESULT_VALUE等核心字段 - 如果你的数组不是PHP格式,只需要把遍历逻辑转换成对应语言(比如Python的嵌套循环)即可
内容的提问来源于stack exchange,提问作者Hazzy
相关产品推荐
相关产品推荐

