我有一个嵌套循环,
while()
{
for()
{
}
}
在我的页面中,我试图打破for循环并进入while循环而不退出它。我尝试了break;
,break 1;
和goto xxx;
,但这些都无效。这是代码:
while( $results = pg_fetch_assoc( $result ) )
{
$url = $results['url'];
for( $i = 0; $i < ($recordnum - 1); $i++ )
{
$urlpopup = $foldername . "/" . $namecomingform[$i];
if( $url == $urlpopup )
{
$isthererecord = 'yes';
goto getoutoffor;
}
else
{
$isthererecord = 'no';
}
}//end of for
getoutoffor:
if( $isthererecord == 'no' )
{
$sql = "UPDATE pictures SET erased='1' WHERE url='" . $url . "'";
$run = pg_query( $sqlconnection, $sql );
}
} //end of while
它似乎只检查数据库中的一条记录。
感谢任何帮助。
答案 0 :(得分:2)
你可能担心这部分:
$url = $results['url'];
for( $i = 0; $i < ($recordnum - 1); $i++ )
{
$urlpopup = $foldername . "/" . $namecomingform[$i];
if( $url == $urlpopup )
{
$isthererecord = 'yes';
goto getoutoffor;
}
else
{
$isthererecord = 'no';
}
}//end of for
getoutoffor:
阅读它。您在此处循环只是为了测试$url
末尾的数字是否在0
和$recordnum - 1
之间。而是从字符串中提取前缀和数字。比较前缀,如果匹配,检查数字是否在该范围内。
这样做还可以进一步阐明您对代码的逻辑问题。从你的问题的措辞来看,你看起来在这里错误的地方,所以我希望我的答案是有帮助的。
答案 1 :(得分:1)
我知道我有点晚了,但我遇到了类似的问题。适用于您的情况,我要做的是将代码更改为以下内容:
$LoopBreak = 'no';
while( $results = pg_fetch_assoc( $result ) )
{
if ($LoopBreak == 'yes') {
break;//Insert break statement here
}
else { //This is First else
$url = $results['url'];
for( $i = 0; $i < ($recordnum - 1); $i++ )
{
$urlpopup = $foldername . "/" . $namecomingform[$i];
if( $url == $urlpopup )
{
$isthererecord = 'yes';
$LoopBreak = 'yes'; //Variable added in place of break here
}
else
{
$isthererecord = 'no';
}
}//end of for
if( $isthererecord == 'no' )
{
$sql = "UPDATE pictures SET erased='1' WHERE url='" . $url . "'";
$run = pg_query( $sqlconnection, $sql );
}
}//End First else
} //end of while
答案 2 :(得分:0)
正如其他人所说,break;
是您应该使用的。如果你的代码不能用于break;那么它很可能是其他问题,例如if语句检查或for循环中的条件永远不会被满足(意味着for循环从未启动) 。你应该更多地调试你的代码。 但请勿使用goto
。使用break;
假设所有变量都是正确的,下面的代码应该可以正常工作:
while( $results = pg_fetch_assoc( $result ) )
{
$url = $results['url'];
for( $i = 0; $i < ($recordnum - 1); $i++ )
{
$urlpopup = $foldername . "/" . $namecomingform[$i];
if( $url == $urlpopup )
{
$isthererecord = 'yes';
break;
}
else
{
$isthererecord = 'no';
}
}//end of for
if( $isthererecord == 'no' )
{
$sql = "UPDATE pictures SET erased='1' WHERE url='" . $url . "'";
$run = pg_query( $sqlconnection, $sql );
}
} //end of while
答案 3 :(得分:0)
不是处理此问题的最佳方式,但您可以为FOR循环添加额外条件,(&amp;&amp; $ isthererecord!='yes')并初始化 $ isthererecord 变量在进入循环之前,因此修改后的代码最终会如下所示:
$isthererecord = '';
while ( $results = pg_fetch_assoc( $result ) ) {
$url = $sorgusonucu['url'];
for ( $i = 0; $i < ( $recordnum - 1 ) && $isthererecord != 'yes'; $i++ ) {
$urlpopup = $foldername . "/" . $namecomingform[ $i ];
if ( $url == $urlpopup ) {
$isthererecord = 'yes';
continue;
}
else {
$isthererecord = 'no';
}
}
if ( $isthererecord == 'no' ) {
$sql = "UPDATE pictures SET erased = '1' WHERE url = '" . $url . "'";
$run = pg_query( $sqlconnection, $sql );
}
}
答案 4 :(得分:0)
for循环中根本不需要其他
while ( $results = pg_fetch_assoc( $result ) ) {
$url = $sorgusonucu['url'];
for ( $i = 0; $i < ( $recordnum - 1 ) && $isthererecord != 'yes'; $i++ ) {
$urlpopup = $foldername . "/" . $namecomingform[ $i ];
if ( $url === $urlpopup ) {
$sql = "UPDATE pictures SET erased = '1' WHERE url = '" . $url . "';";
$run = pg_query( $sqlconnection, $sql );
break;
}
}
}