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; } }
说明
- 移除了
$dataStartRow = 7;这行重置代码,避免全局变量被强制修改 - 每个
$columns循环内新增临时变量$currentStartRow,基于当前组的$dataStartRow初始化,用来在column循环内递增 - 全局的
$dataStartRow只会在每个group循环结束后更新为$lastRow+1,确保下一组循环时能用上一组的最终值作为起始
这样修改后,就能得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Obsidia
相关产品推荐
相关产品推荐

