PHP - для каждого цикла - пропустить, если одинаковые значения (но все же сумма значений) - PullRequest
0 голосов
/ 09 октября 2018

У меня есть цикл ниже:

 $Sum = '';
 $CommodityCode = '';
     foreach ($obj['statisticalvalues'] as $key => $value) {
         if (isset($obj['commoditycodes'][$key]['match'])) {
             //If our commodity code from last iteration is the same as current = we have a duplicate!
             if ($CommodityCode !== $obj['commoditycodes'][$key]['match']) {
                  $Sum = $value['key_0'];
              } else {
                  $Sum += $value['key_0'];
              }

              $ReturnString .= '' . $obj['commoditycodes'][$key]['match'] . '';
              $ReturnString .= '' . $Sum . '';

              //Set the code for next iteration
              $CommodityCode = $obj['commoditycodes'][$key]['match'];
            }
        }

, который будет выводить:

CODE        VALUE
3002190000  610.20
3002190000  846.7
3002190000  1083.2
3002190000  4156.4
3002190000  4461.5
3002190000  4711.4
3002190000  5061.4
3002190000  6061
3002190000  6886.3
3002190000  7136.2
3002190000  7435.8
3002190000  8196
3002190000  8466.2
8000120000  1000.5

Как видите, VALUE суммирует правильно, но все равно печатает CODE для каждой строки.

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

CODE        VALUE
3002190000  8466.2
8000120000  1000.5

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

вот пример, который может быть связан с вашей проблемой

$input = array(
  array('code'=>'ID001', 'value'=>100),
  array('code'=>'ID001', 'value'=>78),
  array('code'=>'ID002', 'value'=>123),
  array('code'=>'ID002', 'value'=>104),
  array('code'=>'ID001', 'value'=>119),
  array('code'=>'ID001', 'value'=>93),
  array('code'=>'ID003', 'value'=>55),
);

//process
$output=array();
foreach($input as $item){
  if(isset($output[$item['code']])){
    $output[$item['code']] += $item['value'];
  }else{
    $output[$item['code']] = $item['value'];
  }
}

//print output
echo "CODE : VALUE";
foreach($output as $code=>$value){
  echo "<br>$code : $value";
}
0 голосов
/ 09 октября 2018

Предполагая, что массив $input имеет по крайней мере два столбца в строке, а именно 'CODE' и 'VALUE', мы можем использовать 'CODE' в качестве ключа (который по сути уникален) для суммирования значений в нашем $output array:

$output = array();
foreach($input as $row)
{
    $key = $row['CODE'];
    $value = $row['VALUE'];
    $output[$key] = isset($output[$key]) ? $output[$key] + $value : $value;
}
print_r($output);

Обратите внимание, что приведенное выше решение приводит к динамическому росту массива $output, что может быть (временной) проблемой для больших массивов.Если это так, рассмотрите возможность предварительного вычисления уникальных значений для $input[$i]['CODE'] $i=1 ... count($input), чтобы вы могли предварительно выделить массив $output с помощью array_pad.

0 голосов
/ 09 октября 2018

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

$Sum = '';
$CommodityCode = '';
foreach ($obj['statisticalvalues'] as $key => $value) {
    if (isset($obj['commoditycodes'][$key]['match'])) {
        //If our commodity code from last iteration is the same as current = we have a duplicate!
       if ($CommodityCode !== $obj['commoditycodes'][$key]['match']) {
           if ( $CommodityCode != '' ) {
               $ReturnString .= '' . $obj['commoditycodes'][$key]['match'] . '';
               $ReturnString .= '' . $Sum . '';
           }
           $Sum = $value['key_0'];
       } else {
           $Sum += $value['key_0'];
       }

       //Set the code for next iteration
       $CommodityCode = $obj['commoditycodes'][$key]['match'];
    }
}
if ( $CommodityCode != '' ) {
    $ReturnString .= '' . $obj['commoditycodes'][$key]['match'] . '';
    $ReturnString .= '' . $Sum . '';
}

(У меня нет данных, поэтому я не могу это проверить, но, надеюсь, все должно быть в порядке)

0 голосов
/ 09 октября 2018

Используйте php's array_unique , если вам нужны разные значения.

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

Если вы хотите сохранить своиИсходный массив, создайте новый массив со следующим кодом.

<?php

 $newArrayDistinct = array_unique($obj['statisticalvalues']);

 foreach(newArrayDistinct as $key=>$value){

      // your code here.

 }

Если вы хотите это с вашим текущим кодом, вы можете использовать это ...

 $Sum = '';
 $CommodityCode = '';

$obj['statisticalvalues'] = array_unique($obj['statisticalvalues']);
     foreach ($obj['statisticalvalues'] as $key => $value) {
         if (isset($obj['commoditycodes'][$key]['match'])) {
             //If our commodity code from last iteration is the same as current = we have a duplicate!
             if ($CommodityCode !== $obj['commoditycodes'][$key]['match']) {
                  $Sum = $value['key_0'];
              } else {
                  $Sum += $value['key_0'];
              }

              $ReturnString .= '' . $obj['commoditycodes'][$key]['match'] . '';
              $ReturnString .= '' . $Sum . '';

              //Set the code for next iteration
              $CommodityCode = $obj['commoditycodes'][$key]['match'];
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...