web-dev-qa-db-ja.com

多次元配列array_sum

私はこの質問についてさまざまな投稿を見てきたので、これに対するいくつかの回答が存在する可能性があることを認識しています。しかし、これらを読んだ後、私は賢明ではありません。

次のような配列があります。

[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'])
19
Mr Sorbose

それを行うための方法:

$sum = 0;

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

PHP 5.5+を使用している場合、ループやコールバックを使用せずにこれを行うことができます(関数呼び出しは比較的高価であるため))...以下を使用してください:

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

Array_mapを使用して、配列を必要なものだけに減らします。覚えておいてください、これはPHP 5.3以降でのみ機能します。

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

array_map最初にvatAmout値を収集します。

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

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
Mark Baker

array_map() を使用してこれを実行し、最初にvatAmount列を選択します。

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

もちろん、これは内部的に二重ループを実行します。コード内に表示されないだけです。 array_reduce() を使用すると、1つのループを取り除くことができます。

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

Array_reduceを使用してこれを行うもう1つの方法:

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

配列内のすべてを合計するarray_sumを使用してこれを直接行うことはできません。

あなたはループでそれを行うことができます:

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

または、配列をフィルタリングすることもできます(この場合はあまり便利ではありません)。ただし、たとえば、S&H費用とVATプラスを計算する必要がある場合は、各単一の項目から計算し、合計します。 ...):

// 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
LSerni

また、これを行うことができます(array_sum関数が好きな場合):

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

$Total = array_sum($vatAmount);
1
RDK