PHP:根据foreach循环中另一个变量的变化增加变量

我有一个foreach循环,用于打印应用程序中订单项更改的历史记录。 每个订单项都有一个数字,每个订单项都可以有多处更改。</ p>

我想要做的是在循环执行时显示每个更改旁边的行号。 $ i </ code>将保留行号。</ p>

  $ i = 1; 
foreach($ lineItem as $ line){
echo $ i; //行号
echo $ line ['field_changed'];
echo $ line ['change_date'];
echo $ line ['change_from'];
echo $ line ['change_to'];
}
</ code> </ pre>

代码从名为 line_item_changes </ code>的数据库表中读取,结构如下:</ p>

   id line_id parent_id 


1 2401 521
2 2401 521
3 2401 521
4 2500 521
5 2502 521
6 2502 521

</ code> </ pre>

每当 $ line ['line_id'] </ code>中的值发生变化时,我想增加 $ i </ code> 。 因此,当结果显示时,它们看起来像这样:</ p>

  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
</ code> </ pre>

等。</ p>
</ div>

展开原文

原文

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.

php
doushua7737
doushua7737 对,那是正确的。每当line_id改变时,$i应该增加1。所以前三个变化(2401)将是第1行($i=1),2500将是第2行($i=2)等。
一年多之前 回复
drwxg62286
drwxg62286 你能提供更多信息吗?根据我的理解,你有一个表line_item_changes,你循环它,当line_id改变你想要$i增加,是吗?这是循环通过line_item_changes时的结果吗?:第一个循环:1-2401(无变化),然后2-2401(无变化),然后3-2401(无变化),然后4-2500(line_id已更改,$i将递增)。
一年多之前 回复

2个回答



只需将以前的 line_id </ code>存储在变量中,并更新 $ i </ code> 价值变化。 尝试以下(代码注释中的解释):</ p>

  $ i = 1; 
$ prev_line_id = null; //初始化前一个值

foreach($ lineItem为$ line){

//如果前一个line_id存在
if(isset($ prev_line_id)){

//如果以前的值是 与当前值不匹配
if($ prev_line_id!= $ line ['line_id']){

//增加行号
$ i ++;
}
}

// 设置上一个值
$ prev_line_id = $ line ['line_id'];

echo $ i; //行号
echo $ line ['field_changed'];
echo $ line ['change_date'];
echo $ line ['change_from'];
echo $ line ['change_to'];
} </ pre>

注意</ strong>您可以直接从数据库查询本身获取更改的行号。 您可以使用 Dense_Rank()</ code>等窗口函数。</ p>
</ div>

展开原文

原文

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().

dqoeghe9452
dqoeghe9452 看一下结尾 - 另外一部分答案:stackoverflow.com/a/52352996/2469308
一年多之前 回复
dsomm80482
dsomm80482 MySQL版本> = 8.0确实支持它。 您的版本可能是5+。 无论如何它可以被模仿。 检查我的一个答案:stackoverflow.com/a/52352996/2469308这会给你一些想法。 您可以创建一个新问题,您肯定会得到您的MySQL版本的答案
一年多之前 回复
dsmlf1207915
dsmlf1207915 我想知道如何将它合并到我的代码中。 不幸的是,MySQL不支持dense_rank()函数。
一年多之前 回复
duansang8388
duansang8388 很乐意提供帮助:)您也可以考虑查看dense_rank()并直接从DB本身获取此行号。
一年多之前 回复
doukun1450
doukun1450 编辑后就像一个魅力。 非常感谢。 完美解决方案
一年多之前 回复
dougang1965
dougang1965 事实上,我将先前值的设置移到了循环之外,我们现在只需要检查先前的值是否匹配,并相应地增加$ i。
一年多之前 回复
dqnf28092
dqnf28092 谢谢你的发现。 固定。
一年多之前 回复
douyihuaimao733955
douyihuaimao733955 在增加$ i后,您应该将$ prev_line_id设置为$ line ['line_id']。 如果你不这样做,它会增加$ i,当两个具有相同line_id的lineItem在循环中相继出现时。
一年多之前 回复



您必须存储最后一个循环的最后一个 line_id </ code>,然后使用 line_id进行检查 下一个循环的</ code>,如果它们不相等则递增 $ i </ code>,当 $ i </ code>递增时,你将 $ prev_line_id </ code>设置为 当前的 line_id </ code>。</ p>

  $ 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; //行号
echo $ line ['field_changed'];
echo $ line ['change_date'];
echo $ line ['change_from'];
echo $ line ['change_to'];
}
</ code> </ pre>
</ div>

展开原文

原文

You have to store the last line_id of the last loop and then check it with the line_id of the next loop, if they are not equal then increment $i, when $i is incremented you set $prev_line_id to the current 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'];
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问