Несколько групповых сумм массива

Я хочу отобразить массив (который уже отсортирован) и хочу показать все строки массива, включая некоторые групповые итоги (в данном случае итоги одного заказа и итоги за месяц. Вот код, который у меня есть так далеко Когда я «раздеваю» код и подсчитываю только итоги по заказу или месяцу, это работает как шарм, вместе я не вижу решения...

Вот код, который у меня есть до сих пор:

//Put test data in an array [0] = Order, [1] = Month, [2] = Pieces
$data = array(
array("1614-0082","JAN",10),
array("1614-0082","JAN",12),
array("1614-0082","JAN",20),
array("1614-0086","JAN",81),
array("1614-0064","FEB",10),
array("1614-0064","FEB",11),
array("1614-0101","MRT",19),
array("1614-0004","OCT",13),
array("1614-0004","OCT",12),
array("1614-0023","OCT",13),
array("1614-0025","DEC",15),
array("1614-0028","DEC",15),
);

$TotalPcsO = 0; //Total per order
$TotalPcsM = 0; //Total per month
$TotalPcsG = 0; //Grand total
$j = 0;
$i = 0;
$PrevOrder = $data[0][0];
$PrevMonth = $data[0][1];
for($k = 0; $k <= sizeof($data); $k++) {
  while ($PrevMonth === $data[$i][1]) {
    while ($PrevOrder === $data[$j][0]) {
      echo $data[$j][0].' '.$data[$j][1].' '.$data[$j][2];
      echo "<br>";
      $TotalPcsO += $data[$j][2];
      $PrevOrder = $data[$j][0];
      $j++;
    }
    $i = $j;
    //Order Totals 
    echo 'Total of order '.$PrevOrder.': '.$TotalPcsO;
    echo "<br>";
    echo "<br>";
    $TotalPcsM += $TotalPcsO;
    $TotalPcsO = 0;
    $PrevOrder = $data[$i][0];
    $i++;
  }
  $k = $i;
  echo 'Total of month '.$PrevMonth.': '.$TotalPcsM;
  echo "<br>";
  echo "<br>";
  $TotalPcsG += $TotalPcsM;
  $TotalPcsM = 0;
  $PrevMonth = $data[$k][1];
}
//Grand Totals
  echo 'Grand total '.$TotalPcsG;

person Barry V.    schedule 18.12.2014    source источник
comment
Вы уверены, что вам нужно увеличить $i в конце внешнего цикла while? Вы уже присвоили ему значение увеличенного $j... вы не пропускаете здесь строку? То же замечание для $k и ĵ...   -  person fpierrat    schedule 19.12.2014
comment
На самом деле, почему бы не выполнить одну итерацию по всему массиву $data (for()). Для каждой строки, если все та же команда, что и в предыдущей строке, добавьте части в commandPieces, если нет, повторите commandPieces, установите для нее значение 0 и измените prevOrder; то же самое в течение нескольких месяцев в том же цикле for(). Просто пройдите один раз через весь массив, я думаю, нет необходимости в 2 циклах while.   -  person fpierrat    schedule 19.12.2014


Ответы (1)


Попробуйте это... это не так, как я бы сделал, но, основываясь на вашем коде, по крайней мере, это должно работать...

    $TotalPcsO = 0; //Total per order
    $TotalPcsM = 0; //Total per month
    $TotalPcsG = 0; //Grand total
    $PrevOrder = $data[0][0];
    $PrevMonth = $data[0][1];
    foreach($data as $row) {
        $TotalPcsG+=$row[2];
        if($row[0]==$PrevOrder) $TotalPcsO += $row[2];
        else {
            echo "Total of order $PrevOrder: $TotalPcsO<br /><br />";
            $PrevOrder=$row[0];
            $TotalPcsO=$row[2];
        }
        if($row[1]==$PrevMonth) $TotalPcsM += $row[2];
        else {
            echo "Total of month $PrevOrder: $TotalPcsM<br /><br />";
            $PrevMonth=$row[1];
            $TotalPcsM=$row[2];
        }
        echo $row[0].' '.$row[1].' '.$row[2].'<br />';
    }
    echo "Total of order $PrevOrder: $TotalPcsO<br /><br />";
    echo "Total of month $PrevOrder: $TotalPcsM<br /><br />";
    echo "Grand total: $TotalPcsG";
person fpierrat    schedule 18.12.2014
comment
Большое спасибо, мне нужно многому научиться в программировании... это точно! Это решение идеально! Использование циклов if iso никогда не устаревает, чтобы учиться! - person Barry V.; 20.12.2014