4 votes

Accumulation d'un tableau 2D par index

J'ai un tableau qui ressemble à ceci :

Array
(
    [0] => Array
        (
            [amount] => 60.00
            [store_id] => 1
        )

    [1] => Array
        (
            [amount] => 40.00
            [store_id] => 1
        )

    [2] => Array
        (
            [amount] => 10.00
            [store_id] => 2
        )
)

Quelle serait une bonne méthode pour réduire le tableau à un tableau similaire qui totalise le "montant" lié à un store_id.

Par exemple, j'aimerais obtenir ceci :

Array
(
    [0] => Array
        (
            [amount] => 100.00
            [store_id] => 1
        )

    [2] => Array
        (
            [amount] => 10.00
            [store_id] => 2
        )
)

2voto

Jake McGraw Points 16515

Pour reproduire exactement ce que vous avez demandé :

<?php

$stores = array();
$result = array();
foreach($rows as $i => $entry) {
  if (false === ($j = array_search($entry['store'], $stores))) {
    $stores[$i] = $entry['store'];
    $result[$i] = $entry;
  }
  else {
    $result[$j]['amount'] += $entry['amount'];
  }
}

2voto

Tesserex Points 11149

Pour développer la réponse de Thrawn, ce que vous voulez, c'est que votre tableau soit indexé par store_id. Ce que vous voulez à la fin est :

    array (
        [1] => 100.00
        [2] => 10.00
    )

Si vous ne pouvez pas construire cela dès le départ, mais que vous êtes obligé de travailler avec cette structure de tableau originale (appelons-la $stores ), faites ceci :

    $totals = array();
    foreach ($stores as $store) {
        if (!array_key_exists($store['store_id'], $totals)) {
            $totals[$store['store_id']] = $store['amount'];
        }
        else {
            $totals[$store['store_id']] += $store['amount'];
        }
    }

Il y a un tas de façons de faire cette vérification de array_key_exists. empty y isset suffiraient toutes deux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X