
本文档旨在指导开发者如何使用PHP处理多维数组,并根据多个条件(如Taxable属性和Total_Sell值的正负)对数组中的数据进行聚合。我们将通过一个实际案例,详细讲解如何根据VendorId对数据进行分类汇总,最终生成包含不同条件下的总额信息的数组。
在实际的PHP开发中,经常会遇到需要处理复杂的多维数组,并根据特定的业务逻辑对数据进行聚合的情况。 本教程将通过一个具体的示例,演示如何根据VendorId,以及Taxable属性和Total_Sell值的正负,对一个多维数组进行聚合。
数据结构
首先,我们假设有如下的数据结构(JSON格式):
立即学习“PHP免费学习笔记(深入)”;
{
"PurchaseOrders": [
{
"PurchaseOrderId": "9809ae4b-3123-4799-8549-9edc09105188",
"VendorId": "b0ddcf4d-894e-4ffc-ab99-e71676d1a566",
"PONumber": "9999791",
"ReceivedDate": null,
"POSentDate": null
}
],
"SubLineItems": [
{
"SubLineItemId": "0f349da9-8b25-4ec5-9b5a-e9d0d90d11cd",
"ItemTypeCode": 0,
"ItemTypeDescription": "Normal",
"VendorId": "b0ddcf4d-894e-4ffc-ab99-e71676d1a566",
"PurchaseOrderId": "9809ae4b-3123-4799-8549-9edc09105188",
"FreightDataId": null,
"Quantity": 1,
"SellPrice": 353.440150801131,
"SellTotal": 503.44,
"FreightSell": 150.0,
"InstallationSell": 0.0,
"NetPrice": 750.0,
"FreightNet": 100.0,
"Taxable": true,
"Total_Sell": 503.44
},
{
"SubLineItemId": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"ItemTypeCode": 0,
"ItemTypeDescription": "Normal",
"VendorId": "b0ddcf4d-894e-4ffc-ab99-e71676d1a566",
"PurchaseOrderId": "9809ae4b-3123-4799-8549-9edc09105188",
"FreightDataId": null,
"Quantity": 1,
"SellPrice": -100.00,
"SellTotal": -100.00,
"FreightSell": 0.0,
"InstallationSell": 0.0,
"NetPrice": -100.00,
"FreightNet": 0.0,
"Taxable": false,
"Total_Sell": -100.00
}
]
}其中,我们主要关注SubLineItems数组,它包含了多个子项,每个子项都有VendorId,Taxable,Total_Sell等属性。 我们的目标是根据VendorId,将SubLineItems按照Taxable和Total_Sell的正负进行聚合,生成一个新的数组,包含每个Vendor在不同条件下的总额。
实现代码
以下是实现上述功能的PHP代码:
<?php
$data = '{
"PurchaseOrders": [
{
"PurchaseOrderId": "9809ae4b-3123-4799-8549-9edc09105188",
"VendorId": "b0ddcf4d-894e-4ffc-ab99-e71676d1a566",
"PONumber": "9999791",
"ReceivedDate": null,
"POSentDate": null
}
],
"SubLineItems": [
{
"SubLineItemId": "0f349da9-8b25-4ec5-9b5a-e9d0d90d11cd",
"ItemTypeCode": 0,
"ItemTypeDescription": "Normal",
"VendorId": "b0ddcf4d-894e-4ffc-ab99-e71676d1a566",
"PurchaseOrderId": "9809ae4b-3123-4799-8549-9edc09105188",
"FreightDataId": null,
"Quantity": 1,
"SellPrice": 353.440150801131,
"SellTotal": 503.44,
"FreightSell": 150.0,
"InstallationSell": 0.0,
"NetPrice": 750.0,
"FreightNet": 100.0,
"Taxable": true,
"Total_Sell": 503.44
},
{
"SubLineItemId": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"ItemTypeCode": 0,
"ItemTypeDescription": "Normal",
"VendorId": "b0ddcf4d-894e-4ffc-ab99-e71676d1a566",
"PurchaseOrderId": "9809ae4b-3123-4799-8549-9edc09105188",
"FreightDataId": null,
"Quantity": 1,
"SellPrice": -100.00,
"SellTotal": -100.00,
"FreightSell": 0.0,
"InstallationSell": 0.0,
"NetPrice": -100.00,
"FreightNet": 0.0,
"Taxable": false,
"Total_Sell": -100.00
}
]
}';
$arr = json_decode($data, true);
$arr_sublineitems = $arr['SubLineItems'];
$arr_vendor_totals = [];
foreach ($arr_sublineitems as $item) {
$vendor_id = $item['VendorId'];
if (!array_key_exists($vendor_id, $arr_vendor_totals)) {
$arr_vendor_totals[$vendor_id] = [
'FreightSell' => $item['FreightSell'], // Initial FreightSell, can be overwritten later.
'Total_Taxable' => 0,
'Total_Credit_Taxable' => 0,
'Total_NonTaxable' => 0,
'Total_Credit_NonTaxable' => 0,
];
}
if ($item['Taxable'] && $item['Total_Sell'] > 0) {
$arr_vendor_totals[$vendor_id]['Total_Taxable'] += $item['Total_Sell'];
} elseif ($item['Taxable'] && $item['Total_Sell'] < 0) {
$arr_vendor_totals[$vendor_id]['Total_Credit_Taxable'] += abs($item['Total_Sell']); // Use abs() to store positive value
} elseif (!$item['Taxable'] && $item['Total_Sell'] > 0) {
$arr_vendor_totals[$vendor_id]['Total_NonTaxable'] += $item['Total_Sell'];
} elseif (!$item['Taxable'] && $item['Total_Sell'] < 0) {
$arr_vendor_totals[$vendor_id]['Total_Credit_NonTaxable'] += abs($item['Total_Sell']); // Use abs() to store positive value
}
}
echo "<pre>";
print_r($arr_vendor_totals);
echo "</pre>";
?>代码解释
数据准备: 首先,我们使用json_decode函数将JSON字符串转换为PHP数组。然后,我们提取SubLineItems数组,并初始化一个空数组$arr_vendor_totals,用于存储聚合后的数据。
循环遍历: 我们使用foreach循环遍历$arr_sublineitems数组,对于每个子项,我们首先获取VendorId。
判断VendorId是否存在: 使用array_key_exists检查当前VendorId是否已经存在于$arr_vendor_totals数组中。如果不存在,则创建一个新的数组,并初始化各个总额为0。 同时,将FreightSell初始化,这个值会被后续的FreightSell覆盖,最终保留最后一个FreightSell。
条件判断和聚合: 根据Taxable属性和Total_Sell值的正负,使用if-elseif语句判断子项所属的类别,并将Total_Sell的值累加到对应的总额中。 对于Total_Sell小于0的情况,我们使用abs()函数取绝对值,以便存储正数。
输出结果: 最后,我们使用print_r函数打印$arr_vendor_totals数组,查看聚合后的结果。
注意事项
总结
本教程详细讲解了如何使用PHP处理多维数组,并根据多个条件对数据进行聚合。 通过这个示例,你可以掌握如何根据实际业务需求,灵活地处理和分析复杂的数据结构。 在实际开发中,可以根据具体情况,调整代码逻辑,以满足不同的需求。
以上就是PHP多维数组:根据多重条件聚合数据的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号