Php 多维数组和

Php 多维数组和,php,arrays,array-sum,Php,Arrays,Array Sum,我已经看到关于这个问题的各种帖子,所以我知道可能存在一些答案。然而,读了这些,我一点也不明白 我有一个数组,如下所示 [0] => Array ( [id] => 95659865986 [invoiceNumber] => 6374324 [invoiceTitle] => Monthly [invoiceStatus] => Paid [accountId] => 62

我已经看到关于这个问题的各种帖子,所以我知道可能存在一些答案。然而,读了这些,我一点也不明白

我有一个数组,如下所示

[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'])
只是一种方法:

$sum = 0;

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

您不能直接使用
数组\u sum
执行此操作,它将对数组中的所有内容求和

您可以通过循环来完成:

$sum = 0;
foreach($items as $item)
    $sum += $item['vatAmount'];
或者,您可以筛选数组(在本例中,这不是很方便,但是如果您必须从每个项目中计算(例如)S&H费用加上增值税加上…,然后求和…:


我将使用array_map将数组缩减到所需的大小。请记住,这只适用于PHP5.3以后的版本

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

您可以先使用
array\u map
来收集
vatAmout

$sum = array_sum(array_map(function($var) {
  return $var['vatAmout'];
}, $account_invoices));
您也可以这样做(如果您喜欢数组_sum函数):


使用PHP5.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;

如果您有PHP5.5+,您可以在不循环或不使用回调的情况下执行此操作(因为函数调用相对昂贵)。。。只需使用:

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

使用array_reduce执行此操作的另一种方法是:

$vatMount = array_reduce($account_invoices, function($total, $value) {
    return $total + $value['vatAmount'];
});
您可以使用并首先选择
vatAmount
列来执行此操作:

$totalVatAmount = array_sum(array_map(function($account_invoices) { 
    return $account_invoices['vatAmount']; 
}, $account_invoices));
当然,这在内部执行双循环;只是你在代码里看不到它。如果使用,则可以去掉一个循环:

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

数组\和\多维辅助函数

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

数组中只有一个“vatAmount”元素,不适合求和。假设$account\u invoices是多维数组,则未定义$account\u invoices['vatAmount'],而$account\u invoices[0]['vatAmount']是。此解决方案的附加注释:我假设您有一个包含n个数组的数组,其中存在索引“vatAmount”。我认为这是最好的解决方案!
$totalVatAmount = 0;
foreach ($account_invoices as $item) {
    $totalVatAmount += $item['vatAmount'];
}
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;
    }
}