【问题标题】:multidimensional array array_sum多维数组array_sum
【发布时间】:2012-10-02 01:38:46
【问题描述】:

我已经看到关于这个问题的各种帖子,所以我知道可能存在一些答案。然而,在阅读了这些之后,我并没有变得更聪明。

我有一个如下所示的数组。

[0] => Array
    (
        [id] => 95659865986
        [invoiceNumber] => 6374324
        [invoiceTitle] => Monthly
        [invoiceStatus] => Paid
        [accountId] => 6235218753
        [totalExVat] => 158.95
        [dateCreated] => 1 Apr 2012
        [vatAmount] => 20.00
    )

我想做的就是对这个数组的vatAmount 值进行数组求和。

因为以下似乎没有做太多。

(array_sum($account_invoices['vatAmount'])

【问题讨论】:

  • 数组中只有一个“vatAmount”元素,不宜相加。
  • 假设 $account_invoices 是你的多维数组,$account_invoices['vatAmount'] 没有定义,而 $account_invoices[0]['vatAmount'] 是。

标签: php arrays array-sum


【解决方案1】:

只是一种方法:

$sum = 0;

foreach($account_invoices as $num => $values) {
    $sum += $values[ 'vatAmount' ];
}

【讨论】:

  • 对此解决方案的附加评论:我假设您有一个包含 n 个数组的数组,其中存在索引“vatAmount”。
【解决方案2】:

您不能直接使用 array_sum 执行此操作,这将汇总数组中的所有内容。

你可以用循环来做:

$sum = 0;
foreach($items as $item)
    $sum += $item['vatAmount'];

或者您可以过滤数组(在这种情况下不是很方便,但是如果您必须从每个项目中计算 S&H 费用加上增值税加...,然后总和...):

// Input: an array (element #n of array of arrays), output: VAT field
function getVAT($item)
{
    return $item['vatAmount'];
}

// Array with all VATs
$vats = array_map('getVAT', $items);

$sum = array_sum($vats);

【讨论】:

    【解决方案3】:

    我会使用 array_map 将数组减少到只需要的内容。请记住,这仅适用于 PHP 5.3 及更高版本。

    $total_vat = array_sum( array_map(
                     function($element){
                         return $element['vatAmount'];
                     }, 
                 $account_invoices));
    

    【讨论】:

      【解决方案4】:

      您可以先使用array_map 来收集vatAmout 值。

      $sum = array_sum(array_map(function($var) {
        return $var['vatAmout'];
      }, $account_invoices));
      

      【讨论】:

        【解决方案5】:

        你也可以这样做(如果你喜欢 array_sum 函数):

        foreach($account_invoices as $num => $values) {
            $vatAmount[] = $values[ 'vatAmount' ];
        }
        
        $Total = array_sum($vatAmount);
        

        【讨论】:

          【解决方案6】:

          一种使用 PHP 5.3+ 匿名函数的方法

          $account_invoices = array(
              0 => array(
                  'id' => '95659865986',
                  'invoiceNumber' => '6374324',
                  'invoiceTitle' => 'Monthly',
                  'invoiceStatus' => 'Paid',
                  'accountId' => '6235218753',
                  'totalExVat' => 158.95,
                  'dateCreated' => '1 Apr 2012',
                  'vatAmount' => 20.00
              ),
              1 => array(
                  'id' => '95659865987',
                  'invoiceNumber' => '6374325',
                  'invoiceTitle' => 'Monthly',
                  'invoiceStatus' => 'Paid',
                  'accountId' => '6235218753',
                  'totalExVat' => 208.95,
                  'dateCreated' => '1 May 2012',
                  'vatAmount' => 25.00
              ),
          );
          
          
          $sumDetail = 'vatAmount';
          $totalVAT = array_reduce($account_invoices,
                     function($runningTotal, $record) use($sumDetail) {
                         $runningTotal += $record[$sumDetail];
                         return $runningTotal;
                     },
                     0
          );
          echo $totalVAT;
          

          【讨论】:

            【解决方案7】:

            如果你有 PHP 5.5+,你可以在不循环或使用回调的情况下做到这一点(因为函数调用相对昂贵)......只需使用:

            $sum = array_sum(array_column($account_invoices, 'vatAmount'));
            

            【讨论】:

              【解决方案8】:

              使用 array_reduce 的另一种方法:

              $vatMount = array_reduce($account_invoices, function($total, $value) {
                  return $total + $value['vatAmount'];
              });
              

              【讨论】:

                【解决方案9】:

                您可以使用array_map() 执行此操作并首先选择vatAmount 列:

                $totalVatAmount = array_sum(array_map(function($account_invoices) { 
                    return $account_invoices['vatAmount']; 
                }, $account_invoices));
                

                当然,这在内部执行了一个双循环;只是您在代码中看不到它。如果你使用array_reduce(),那么你可以摆脱一个循环:

                $totalVatAmount = array_reduce($account_invoices,
                     function($totalAmount, $item) {
                         $totalAmount += $item['vatAmount'];
                            return $totalAmount;
                     },
                   0
                );
                

                但是,如果速度是唯一的兴趣,您应该使用foreach。因为没有用于计算最终总和的函数调用。此解决方案比其他解决方案更快。

                $totalVatAmount = 0;
                foreach ($account_invoices as $item) {
                    $totalVatAmount += $item['vatAmount'];
                }
                

                【讨论】:

                  【解决方案10】:

                  array_sum_multidimensional Helper 函数

                  if (!function_exists('array_sum_multidimensional')) {
                      /**
                       * returns the sum of a element from an array of arrays
                       */
                  
                      function array_sum_multidimensional(array $array, $elementKey){
                  
                          $sum = 0;
                  
                          foreach($array as $key => $value) {
                              $sum += $value[ $elementKey ];
                          }
                  
                          return $sum;
                      }
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-10-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-08-12
                    • 1970-01-01
                    • 2021-12-02
                    • 2011-09-20
                    • 1970-01-01
                    相关资源
                    最近更新 更多