【问题标题】:PHP - Testing array for multiple conditionsPHP - 多个条件的测试数组
【发布时间】: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 类开始,它包含您需要的字段

标签: php arrays


【解决方案1】:

我最终使用了我发布的最新代码。它提供了预期的结果,并且我很容易理解。我确信它们是更好的方法,并且很想知道是否有人看到了一种更有效的方法来处理这个问题。

我使用的代码是:

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'];
}

}

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 2021-11-10
  • 2014-03-14
  • 2020-10-13
  • 2019-03-18
  • 1970-01-01
  • 2012-12-25
相关资源
最近更新 更多