У меня есть цикл 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
и т.п.
Просто сохраните предыдущий 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()
,
Вы должны хранить последние 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'];
}