多维数组 array_sum

23

我看到过许多关于这个问题的帖子,所以知道可能存在一些回答。但是,阅读了这些回答后,我仍然不明白。

我有一个像下面这样的数组。

[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",将其求和是不恰当的。 - Bud Damyanov
1
假设 $account_invoices 是您的多维数组,$account_invoices['vatAmount'] 未定义,而 $account_invoices[0]['vatAmount'] 已定义。 - Asad Saeeduddin
10个回答

76

如果您有PHP 5.5+,您可以不使用循环或回调(因为函数调用相对较慢)...只需使用:

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

26

我会使用array_map将数组减少到所需的内容。请注意,这仅适用于PHP 5.3及以上版本。

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

19

一个简单的方法:

$sum = 0;

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

对此解决方案的补充说明:我假设您有一个包含n个数组的数组,其中包含索引“vatAmount”。 - matthias

9
你可以先使用 array_map 来收集 vatAmout 值。
$sum = array_sum(array_map(function($var) {
  return $var['vatAmout'];
}, $account_invoices));

4
使用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;

4
你可以使用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'];
}

1

使用array_reduce另一种实现方式:

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

1

使用array_sum无法直接完成此操作,因为它会将数组中的所有元素相加。

您可以使用循环来实现:

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

或者您可以过滤数组(在这种情况下不是很方便,但如果您必须计算每个单独项目的运输和处理费用以及增值税等,然后再求和...):

// 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);

1

如果你喜欢使用array_sum函数,也可以这样做:

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

$Total = array_sum($vatAmount);

1

array_sum_multidimensional 辅助函数

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接