【发布时间】:2021-11-15 13:12:46
【问题描述】:
我有一个多维数组,经过过滤得到一个数组:
$arr_sublineitems[$lineitem_data[$j]['SubLineItems'][$k]['SubLineItemId']]=[
'VendorId' => $lineitem_data[$j]['SubLineItems'][$k]['VendorId'],
'Quantity' => $lineitem_data[$j]['SubLineItems'][$k]['Quantity'],
'SellPrice' => $lineitem_data[$j]['SubLineItems'][$k]['SellPrice'],
'FreightSell' => $lineitem_data[$j]['SubLineItems'][$k]['FreightSell'],
'NetPrice' => $lineitem_data[$j]['SubLineItems'][$k]['NetPrice'],
'FreightNet' => $lineitem_data[$j]['SubLineItems'][$k]['FreightNet'],
'Taxable' => $lineitem_data[$j]['SubLineItems'][$k]['Taxable'],
'ProjectId' => $project_id,
'Total_Sell' => ($lineitem_data[$j]['SubLineItems'][$k]['SellPrice'] * $lineitem_data[$j]['SubLineItems'][$k]['Quantity'])
在结果数组中,在移动到数据库之前,我需要根据供应商的应税/非应税和 >0 或
如果尝试使用 foreach 和多个 if/else 进行此操作,但我需要在满足条件并将 $arr_sublineitems 中的值添加到已解析数组之一时退出...我无法弄清楚如何使用break/continue 或 switch 语句...我当前的代码是:
foreach($arr_sublineitems as $key => $item){
if($item['Total_Sell'] > 0 && $item['Taxable']){
if(!isset($arr_sublineitems[$item]['VendorId'])){
$arr_sublineitems_taxable[$item]['VendorId'] = array('FreightSell' => $item['FreightSell'],
'Total_Sell' => $item['VendorId']['Total_Sell']
);
}else{
$arr_sublineitems_taxable[$item]['VendorId']['Total_Sell']+= $item['Total_Sell'];
}
}
if($item['Total_Sell'] > 0 && !($item['Taxable'])){
if(!isset($arr_sublineitems[$key]['VendorId'])){
$arr_sublineitems_nontaxable[$key]['VendorId'] = array('FreightSell' => $item['FreightSell'],
'Total_Sell' => $item['Total_Sell']);
}else{
$arr_sublineitems_nontaxable[$key]['VendorId']['Total_Sell']+= $item['Total_Sell'];
}
}
if($item['Total_Sell'] < 0 && $item['Taxable']){
if(!isset($arr_sublineitems[$key])){
$arr_sublineitems_taxable_credit[$key] = array('FreightSell' => $item['FreightSell'],
'Total_Sell_Credit' => $item['Total_Sell']);
}else{
$arr_sublineitems_nottaxable_credit[$key]['Total_Sell_Credit']+= $item['Total_Sell_Credit'];
}
}
if($item['Total_Sell'] < 0 && !($item['Taxable'])){
if(!isset($arr_sublineitems[$key])){
$arr_sublineitems_taxable_credit[$key] = array('FreightSell' => $item['FreightSell'],
'Total_Sell_Credit' => $item['Total_Sell']);
}else{
$arr_sublineitems_nottaxable_credit[$key]['Total_Sell_Credit']+= $item['Total_Sell_Credit'];
}
}
}
我已将我的代码编辑为:
foreach($arr_sublineitems as $key => $item) {
$vendor_id = $item['VendorId'];
if (!array_key_exists($vendor_id, $arr_vendor_totals)) {
if ($item['Taxable'] && $item['Total_Sell'] > 0) {
$arr_vendor_totals[$vendor_id] = array('FreightSell' => $item['FreightSell'],
'Total_Taxable' => $item['Total_Sell']);
} elseif ($item['Taxable'] && $item['Total_Sell'] < 0) {
$arr_vendor_totals[$vendor_id]['Total_Credit_Taxable'] = array('FreightSell' => $item['FreightSell'],
'Total_Taxable' => $item['Total_Sell']);
} elseif (!$item['Taxable'] && $item['Total_Sell'] > 0) {
$arr_vendor_totals[$vendor_id]['Total_NonTaxable'] = array('FreightSell' => $item['FreightSell'],
'Total_Taxable' => $item['Total_Sell']);
} elseif (!$item['Taxable'] && $item['Total_Sell'] < 0) {
$arr_vendor_totals[$vendor_id]['Total_Credit_NonTaxable'] = array('FreightSell' => $item['FreightSell'],
'Total_Taxable' => $item['Total_Sell']);
}
continue;
}
if (array_key_exists($vendor_id, $arr_vendor_totals)){
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'] += $item['Total_Credit_Taxable'];
} elseif (!$item['Taxable'] && $item['Total_Sell'] > 0) {
$arr_vendor_totals[$vendor_id]['Total_NonTaxable'] += $item['Total_NonTaxable'];
} elseif (!$item['Taxable'] && $item['Total_Sell'] < 0) {
$arr_vendor_totals[$vendor_id]['Total_Credit_NonTaxable'] += $item['Total_Credit_NonTaxable'];
}
}
}
@Chris Haas - 数据以 json 关联多维数组的形式提供。
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
},
...
供应商可以有 1..n 个采购订单,采购订单可以有 1..n 个行项目,行项目可以有 1..n 个子行项目...
我正在尝试以两种方式汇总/汇总 SubLineItems - 1)按供应商:应税、非应税 >0 SellPrice 和应税/非应税 0 SellPrice 和应税/非应税
感谢您查看此内容...我也将查看 @Riggs Folly 的解决方案。
【问题讨论】:
-
这些数据来自哪里?如果它来自某种数据库,则最好使用数据库引擎进行分组。
-
代码中有很多东西感觉像是潜在的错误。例如,在您的内部
if statement you are checking$arr_sublineitems, but sometimes by a$item` 作为子数组,有时由$key作为子数组,有时只是由$key。这可能是完全有效的,但它也感觉很神奇/任意。您的第三个和第四个完整块似乎也分配了错误的数组。注释可能会有所帮助,但也可能有助于将这个神奇的数组抽象为更容易理解的东西,例如对象。 -
@TheGentleman - 它来自一个 json 文件,指向一个数据库。
-
@Chris Haas - 我完全同意,正在寻找最佳方法的清晰度,我正在努力简化......
-
不幸的是,您提供的源数组真的很难理解,因此很难走得更远。具体来说,
$arr_sublineitems[$lineitem_data[$j]['SubLineItems'][$k]['SubLineItemId']]。也许您可以生成 JSON 本身的编辑子集,除非它已经是数组格式?我们经常为此创建非常轻量级的一次性类,称为 DTO,它只是帮助我们进行更高层次的推理。也许从创建一个简单的Item类开始,它包含您需要的字段