I have a foreach loop that prints the history of line item changes in my application. Each line item has a number, and each line item can have multiple changes.
What I want to do is display the line number alongside each change when my loop executes. $i
will hold the line number.
$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'];
}
The code reads from a DB table called line_item_changes
with the following structure:
id line_id parent_id
-- ------- ---------
1 2401 521
2 2401 521
3 2401 521
4 2500 521
5 2502 521
6 2502 521
I want to increment $i
every time the value in $line['line_id']
changes. So that, when the results display, they look something like this:
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
etc.
Just store the previous line_id
in a variable, and update $i
if the value changes. Try the following (explanation in code comments):
$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'];
}
Note that you can get the changing line number directly from DB query itself. You can use window functions like Dense_Rank()
.