Вопрос по array-sum, php, arrays – многомерный массив array_sum

15

Я видел различные сообщения по этому вопросу, поэтому знаю, что некоторые ответы на этот вопрос могут существовать. однако я не стал мудрее после прочтения.

У меня есть массив, который выглядит следующим образом.

[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'])
предполагая, что $ account_invoices - это ваш многомерный массив, $ account_invoices ['сумма НДС'] не определено, тогда как $ account_invoices [0] ['сумма НДС'] является. Asad Saeeduddin
У вас есть только одинсумма НДС" элемент массива, его неуместно суммировать. bodi0

Ваш Ответ

9   ответов
1

array_sum, который будет суммировать все в массиве.

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

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

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

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

Вы можете сделать это используя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'];
}
25

чтобы уменьшить массив только до того, что нужно. Имейте в виду, это будет работать только с PHP 5.3 и выше.

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

Вы могли бы использоватьarray_map сначала собратьvatAmout значение.

$sum = array_sum(array_map(function($var) {
  return $var['vatAmout'];
}, $account_invoices));
Это самый мудрый и профессиональный ответ на этот вопрос. NBPalomino
52

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

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

Просто способ сделать это:

$sum = 0;

foreach($account_invoices as $num => $values) {
    $sum += $values[ 'vatAmount' ];
}
Дополнительный комментарий к этому решению: я предполагаю, что у вас есть массив, содержащий n массивов с индексом 'сумма НДС' подарок. matthias
1

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

$Total = array_sum($vatAmount);
1

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

Похожие вопросы