在PHP中打破嵌套循环

时间:2012-10-22 13:35:10

标签: php for-loop while-loop break nested-loops

我有一个嵌套循环,

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

它似乎只检查数据库中的一条记录。

感谢任何帮助。

5 个答案:

答案 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;
        }
    }
}