PHP: увеличить переменную на основе изменения другой переменной в цикле foreach - PullRequest
0 голосов
/ 09 октября 2018

У меня есть цикл foreach, который печатает историю изменений позиций в моем приложении.У каждой позиции есть номер, и у каждой позиции может быть несколько изменений.

Что я хочу сделать, это отобразить номер строки рядом с каждым изменением при выполнении моего цикла.$i будет содержать номер строки.

$i = 1;
foreach($lineItem as $line) {
   echo $i; //line number
   echo $line['field_changed'];
   echo $line['change_date'];
   echo $line['change_from'];
   echo $line['change_to'];
}

Код считывается из таблицы БД с именем line_item_changes со следующей структурой:

id  line_id  parent_id
--  -------  ---------
1   2401     521
2   2401     521
3   2401     521
4   2500     521
5   2502     521
6   2502     521  

Я хочу увеличить $iкаждый раз, когда значение в $line['line_id'] изменяется.Чтобы при отображении результатов они выглядели примерно так:

Line #: 1
field: notes
date: 10/9/2018
from: test
to: test2

Line #: 1
field: quantity
date: 10/1/2018
from: 4
to: 3

Line #: 2
field: need_date
date: 10/1/2018
from: 10/24/2018
to: 10/27/2018

и т. Д.

Ответы [ 2 ]

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

Вы должны сохранить последние line_id последнего цикла, а затем проверить их с помощью line_id следующего цикла, если они не равны, то увеличивайте $i, когда $i увеличивается, вы устанавливаете $prev_line_id до текущего line_id.

$prev_line_id = $lineItem[0]['line_id'] ?? null;
$i = 0;
foreach($lineItem  as $line)
{
    if($line['line_id'] != $prev_line_id )
    {
        $i++;
        $prev_line_id = $line['line_id'];
    }

    echo $i; //line number
    echo $line['field_changed'];
    echo $line['change_date'];
    echo $line['change_from'];
    echo $line['change_to'];
}
0 голосов
/ 09 октября 2018

Просто сохраните предыдущий line_id в переменной и обновите $i, если значение изменится.Попробуйте следующее (объяснение в комментариях к коду):

$i = 1;
$prev_line_id = null; // initializing the previous value

foreach($lineItem as $line) {

   // if the previous line_id exists
   if (isset($prev_line_id)) {

       // if previous value does not match with the current value
       if ($prev_line_id != $line['line_id']) {

           // increment the line number
           $i++;
       }
   }

   // set the previous value
   $prev_line_id = $line['line_id'];

   echo $i; //line number
   echo $line['field_changed'];
   echo $line['change_date'];
   echo $line['change_from'];
   echo $line['change_to'];
}

Обратите внимание , что вы можете получить изменяющийся номер строки непосредственно из самого запроса к БД.Вы можете использовать оконные функции, такие как Dense_Rank().

...