web-dev-qa-db-fra.com

tableau multidimensionnel tableau_sum

J'ai vu plusieurs personnes postées à propos de cette question, donc je suis au courant qu'il peut exister des réponses. Cependant, je ne suis pas le plus sage après avoir lu ces. 

J'ai un tableau qui ressemble à ce qui suit.

[0] => Array
    (
        [id] => 95659865986
        [invoiceNumber] => 6374324
        [invoiceTitle] => Monthly
        [invoiceStatus] => Paid
        [accountId] => 6235218753
        [totalExVat] => 158.95
        [dateCreated] => 1 Apr 2012
        [vatAmount] => 20.00
    )

Tout ce que je veux faire est de faire la somme du tableau sur les valeurs vatAmount de ce tableau.

Comme ce qui suit ne semble pas faire grand chose.

(array_sum($account_invoices['vatAmount'])
13
Mr Sorbose

Juste un moyen de le faire:

$sum = 0;

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

Si vous avez PHP 5.5+, vous pouvez le faire sans boucle ni rappel (car les appels de fonctions sont relativement coûteux) ... utilisez simplement:

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

J'utiliserais array_map pour réduire le tableau à ce qui est nécessaire. N'oubliez pas que cela ne fonctionnera qu'à partir de PHP 5.3.

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

Vous pouvez d'abord utiliser array_map pour collecter la valeur vatAmout.

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

Une façon de faire cela en utilisant une fonction PHP 5.3+ anonyme

$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

Juste une autre façon de faire cela en utilisant array_reduce:

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

Pour ce faire, utilisez array_map() et sélectionnez la colonne vatAmount en premier:

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

Bien sûr, en interne cela effectue une double boucle; c'est juste que vous ne le voyez pas dans le code. Si vous utilisez array_reduce() alors vous pouvez vous débarrasser d’une boucle:

$totalVatAmount = array_reduce($account_invoices,
     function($totalAmount, $item) {
         $totalAmount += $item['vatAmount'];
            return $totalAmount;
     },
   0
);

Cependant, si la vitesse est le seul intérêt, vous devriez utiliser foreach. Parce qu'il n'y a pas d'appels de fonction utilisés pour calculer la somme finale. Cette solution est plus rapide qu'une autre solution.

$totalVatAmount = 0;
foreach ($account_invoices as $item) {
    $totalVatAmount += $item['vatAmount'];
}
1
Faisal

Vous ne pouvez pas faire cela directement avec array_sum, qui totaliserait tout dans le tableau.

Vous pouvez le faire avec une boucle:

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

ou vous pouvez filtrer le tableau (dans ce cas ce n'est pas très pratique , mais si vous deviez calculer, par exemple, les frais de port, taxes et frais plus TVA plus ..., à partir de chaque élément, puis la somme ... ):

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

Vous pouvez aussi faire ceci (si vous aimez la fonction array_sum): 

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

$Total = array_sum($vatAmount);
1
RDK