Многомерный массив 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'])

Ответ 1

Только способ сделать это:

$sum = 0;

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

Ответ 2

Если у вас есть PHP 5.5+, вы можете сделать это без цикла или использования обратного вызова (поскольку вызовы функций относительно дороги)... просто используйте:

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

Ответ 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

Способ сделать это с помощью анонимной функции 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;

Ответ 6

Вы не можете сделать это напрямую с помощью array_sum, который суммирует все в массиве.

Вы можете сделать это с помощью цикла:

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

или вы можете отфильтровать массив (в этом случае это не очень удобно, но если вам нужно было рассчитать, например, расходы S & H плюс НДС плюс..., из каждого отдельного item, а затем sum...):

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

Ответ 7

Еще один способ сделать это с помощью array_reduce:

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

Ответ 8

Также вы можете сделать это (если вам нравится функция array_sum):

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

$Total = array_sum($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'];
}