You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP嵌套循环问题:$dataStartRow在多维数组迭代中错误重置

如何让$dataStartRow在循环中保留上一轮的最终值?

我在计算$dataStartRow的取值时遇到了问题:在$row_groups的一轮循环后,$dataStartRow会被重置为7,无法保留上一轮的最终值。比如在Team Group 2中,$dataStartRow变为9后,后续循环又回到了7。下面是实际输出、期望输出及相关代码,请问怎么让$dataStartRow在每个$row_groups循环结束后保留最后值作为下一轮的默认起始值?

实际输出

team_id=207 / dataStartRow=7 / lastRow=7
team_id=208 / dataStartRow=8 / lastRow=7
team_id=207 / dataStartRow=7 / lastRow=8
team_id=208 / dataStartRow=8 / lastRow=8
team_id=207 / dataStartRow=7 / lastRow=8
team_id=208 / dataStartRow=8 / lastRow=8
team_id=207 / dataStartRow=7 / lastRow=8
team_id=208 / dataStartRow=8 / lastRow=8
team_id=207 / dataStartRow=7 / lastRow=8
team_id=208 / dataStartRow=8 / lastRow=8
==============================
team_id=209 / dataStartRow=9 / lastRow=9
team_id=209 / dataStartRow=7 / lastRow=9
team_id=209 / dataStartRow=7 / lastRow=9
team_id=209 / dataStartRow=7 / lastRow=9
team_id=209 / dataStartRow=7 / lastRow=9
==============================
team_id=210 / dataStartRow=10 / lastRow=10
team_id=21 / dataStartRow=11 / lastRow=10
team_id=210 / dataStartRow=7 / lastRow=11
team_id=21 / dataStartRow=8 / lastRow=11
team_id=210 / dataStartRow=7 / lastRow=11
team_id=21 / dataStartRow=8 / lastRow=11
team_id=210 / dataStartRow=7 / lastRow=11
team_id=21 / datastartRow=8 / lastRow=11
team_id=210 / dataStartRow=7 / lastRow=11
team_id=21 / dataStartRow=8 / lastRow=11

期望输出

team_id=207 / dataStartRow=7 / lastRow=7
team_id=208 / datastartRow=8 / lastRow=7
team_id=207 / dataStartRow=7 / lastRow=8
team_id=208 / dataStartRow=8 / lastRow=8
team_id=207 / dataStartRow=7 / lastRow=8
team_id=208 / dataStartRow=8 / lastRow=8
team_id=207 / dataStartRow=7 / lastRow=8
team_id=208 / dataStartRow=8 / lastRow=8
team_id=207 / dataStartRow=7 / lastRow=8
team_id=208 / dataStartRow=8 / lastRow=8
==============================
team_id=209 / dataStartRow=9 / lastRow=9
team_id=209 / dataStartRow=9 / lastRow=9
team_id=209 / dataStartRow=9 / lastRow=9
team_id=209 / dataStartRow=9 / lastRow=9
team_id=209 / dataStartRow=9 / lastRow=9
=============================
team_id=210 / dataStartRow=10 / lastRow=10
team_id=211 / dataStartRow=11 / lastRow=10
team_id=210 / dataStartRow=10 / lastRow=11
team_id=211 / dataStartRow=11 / lastRow=11
team_id=210 / dataStartRow=10 / lastRow=11
team_id=211 / dataStartRow=11 / lastRow=11
team_id=210 / dataStartRow=10 / lastRow=11
team_id=211 / dataStartRow=11 / lastRow=11
team_id=210 / dataStartRow=10 / lastRow=11
team_id=211 / dataStartRow=11 / lastRow=11

相关代码

$row_groups = array(
    0 => array(
        "Team Group 1" => array(
            0 => array(
                "team_id" => 207,
                "team_name" => "Child Team"
            ),
            1 => array(
                "team_id" => 208,
                "team_name" => "Child Team 2"
            )
        )
    ),
    1 => array(
        "Team Group 2" => array(
            0 => array(
                "team_id" => 209,
                "team_name" => "Child Team 3"
            )
        )
            ),
    2 => array(
        "Team Group 3" => array(
            0 => array(
                "team_id" => 210,
                "team_name" => "Child Team 4"
            ),
            1 => array(
                "team_id" => 211    ,
                "team_name" => "Child Team 5"
            )
        )
    ),
);

$columns = array(
    0 => 620,
    1 => 621,
    2 => 622,
    3 => 623,
    4 => 624
);

$dataStartRow = 7;

foreach($row_groups as $team_group) {
    foreach($team_group as $group => $teams) {
        $lastRow = $dataStartRow;

            foreach ($columns as $index => $iRoleId) {
                foreach ($teams as $team) {

                        echo "<pre>".print_r("team_id=".$team['team_id']." / "."datatartRow=".$dataStartRow." / "."lastRow=".$lastRow,true);
                        $lastRow = ($dataStartRow > $lastRow) ? $dataStartRow : $lastRow;

                        $dataStartRow++;
                }   

                // Reset Start Row
                $dataStartRow = 7;

            }
        echo "<pre>".print_r("==============================",true);
        $dataStartRow = $lastRow+1;
    }
}

解决方案

问题根源是你在$columns循环内部执行了$dataStartRow = 7;,这会强制把起始行重置为7,导致每个column循环结束后,全局的$dataStartRow被打回初始值,只有在整个group循环结束后才会更新,但后续的column循环又会再次重置,所以无法保留上一轮的最终值。

正确的做法是:不要在$columns循环内重置$dataStartRow,而是为每个column循环创建一个临时变量,基于当前组的起始行进行递增操作,避免修改全局的$dataStartRow。

修改后的代码如下:

$row_groups = array(
    0 => array(
        "Team Group 1" => array(
            0 => array(
                "team_id" => 207,
                "team_name" => "Child Team"
            ),
            1 => array(
                "team_id" => 208,
                "team_name" => "Child Team 2"
            )
        )
    ),
    1 => array(
        "Team Group 2" => array(
            0 => array(
                "team_id" => 209,
                "team_name" => "Child Team 3"
            )
        )
            ),
    2 => array(
        "Team Group 3" => array(
            0 => array(
                "team_id" => 210,
                "team_name" => "Child Team 4"
            ),
            1 => array(
                "team_id" => 211    ,
                "team_name" => "Child Team 5"
            )
        )
    ),
);

$columns = array(
    0 => 620,
    1 => 621,
    2 => 622,
    3 => 623,
    4 => 624
);

$dataStartRow = 7;

foreach($row_groups as $team_group) {
    foreach($team_group as $group => $teams) {
        $lastRow = $dataStartRow;

        foreach ($columns as $index => $iRoleId) {
            // 为当前column循环创建临时起始行变量,基于全局的dataStartRow初始化
            $currentStartRow = $dataStartRow;
            foreach ($teams as $team) {
                echo "<pre>".print_r("team_id=".$team['team_id']." / "."dataStartRow=".$currentStartRow." / "."lastRow=".$lastRow,true);
                $lastRow = ($currentStartRow > $lastRow) ? $currentStartRow : $lastRow;
                $currentStartRow++;
            }   
            // 移除重置为7的代码
        }
        echo "<pre>".print_r("==============================",true);
        $dataStartRow = $lastRow+1;
    }
}

说明

  1. 移除了$dataStartRow = 7;这行重置代码,避免全局变量被强制修改
  2. 每个$columns循环内新增临时变量$currentStartRow,基于当前组的$dataStartRow初始化,用来在column循环内递增
  3. 全局的$dataStartRow只会在每个group循环结束后更新为$lastRow+1,确保下一组循环时能用上一组的最终值作为起始

这样修改后,就能得到你期望的输出结果。

内容的提问来源于stack exchange,提问作者Obsidia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:27:33