multidimensional array array_sum

后端 未结 10 1932
深忆病人
深忆病人 2020-11-27 06:45

I have seen various posted about this question so am aware some answers to this may exist. however I am none the wiser after reading these.

I have an array that is

相关标签:
10条回答
  • 2020-11-27 07:13

    I would use array_map to reduce the array to only what is needed. Bear in mind, this will only work with PHP 5.3 onwards.

    $total_vat = array_sum( array_map(
                     function($element){
                         return $element['vatAmount'];
                     }, 
                 $account_invoices));
    
    0 讨论(0)
  • 2020-11-27 07:17

    Just another way to do this using array_reduce:

    $vatMount = array_reduce($account_invoices, function($total, $value) {
        return $total + $value['vatAmount'];
    });
    
    0 讨论(0)
  • 2020-11-27 07:24

    A way to do this using a PHP 5.3+ anonymous function

    $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;
    
    0 讨论(0)
  • 2020-11-27 07:25

    You can do this using array_map() and select the vatAmount column first:

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

    Of course, internally this performs a double loop; it's just that you don't see it inside the code. If you use array_reduce() then you can get rid of one loop:

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

    However, if speed is the only interest, you should use foreach. Because there is no function calls used to calculate the final sum. This solution is faster than other solution.

    $totalVatAmount = 0;
    foreach ($account_invoices as $item) {
        $totalVatAmount += $item['vatAmount'];
    }
    
    0 讨论(0)
提交回复
热议问题