Я видел различные сообщения об этом вопросе, поэтому я знаю, что некоторые ответы на это могут существовать. однако я не стал мудрым после прочтения этих данных.
У меня есть массив, похожий на следующий.
[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' ]; }
Если у вас есть PHP 5.5+, вы можете сделать это без цикла или использования обратного вызова (поскольку вызовы функций относительно дороги) … просто используйте:
$sum = array_sum(array_column($account_invoices, 'vatAmount'));
Я бы использовал array_map, чтобы уменьшить массив только до необходимого. Имейте в виду, что это будет работать только с PHP 5.3.
$total_vat = array_sum( array_map( function($element){ return $element['vatAmount']; }, $account_invoices));
array_map
вы можете использовать array_map
для сбора значения vatAmout
.
$sum = array_sum(array_map(function($var) { return $var['vatAmout']; }, $account_invoices));
Способ сделать это с помощью анонимной функции 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;
Вы не можете сделать это непосредственно с помощью 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);
Также вы можете это сделать (если вам нравится функция array_sum):
foreach($account_invoices as $num => $values) { $vatAmount[] = $values[ 'vatAmount' ]; } $Total = array_sum($vatAmount);
Еще один способ сделать это с помощью array_reduce:
$vatMount = array_reduce($account_invoices, function($total, $value) { return $total + $value['vatAmount']; });
Вы можете сделать это с помощью 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']; }