while循环中的break命令可防止第二个while循环运行

时间:2011-03-25 12:37:12

标签: php

在此代码中,第一个while循环仅检查具有$ message字段的帖子数是否多于一个。如果是,则定义变量$ morethanonce,并且break应该退出循环,因为不再需要它。然后第二个while循环应该执行。

但由于某种原因,第一个while循环中断会阻止第二个循环运行。

当然,我可以删除休息,这不是绝对必要的,一切正常,但我希望有人向我解释为什么会发生这种情况。

<?php
function availability_warning () {
    global $post;
    $closed_messages_query = new WP_Query;
    $closed_messages_query->query('post_type=ok_product&showposts=50&orderby=title&order=ASC');
    $i = 0;
    while ($closed_messages_query->have_posts()) : $closed_messages_query->the_post();
        $message =  get_post_meta($post->ID, "ok_product_closed_message", true);    
        if ($message) {
            $i++;
            if ($i == 2){
                $morethanone = "yes";
                break;
            }
        }       
    endwhile;   
    $i = 0;
    while ($closed_messages_query->have_posts()) : $closed_messages_query->the_post();
        $message =  get_post_meta($post->ID, "ok_product_closed_message", true);    
        if ($message) { 
            $i++; 
            if ($i == 1) { 
                if ($morethanone == 'yes'){ echo '<div class="prod-warnings"><ul id="warnings" class="morethanone">';}
                else {echo '<div class="prod-warnings"><ul id="warnings">';}
            }
            echo '<li>'.$message.'</li>'; 
        }                  
    endwhile;
    if ($i > 0) { echo '</ul></div>'; } 
}

?>

2 个答案:

答案 0 :(得分:1)

好的,你的问题不是break命令。 问题在于条件。你使用“while($ closed_messages_query-&gt; have_posts())” 要在附加循环中使用相同的查询,您需要“回滚”查询,否则它将从访问的最后一行继续。

更新:如果你想继续使用你的代码,循环使用似乎是错误的,至少放线

$closed_messages_query->rewind_posts();

在第一个endwhile;

下的两个循环之间

在任何情况下,您的代码都有点过于复杂,这是一个简化的小尝试(可以更好地重构以获得更好的外观和性能)。我不是一个wordpress专家,但这是我的看法(修正你的评论)

<?php
function availability_warning () {
    global $post;
    $closed_messages_query = new WP_Query;
    $closed_messages_query->query('post_type=ok_product&showposts=50&orderby=title&order=ASC');

    if ( $closed_messages_query->have_posts() )
    {
        $i = 0;
        while ($closed_messages_query->have_posts()) : $closed_messages_query->the_post();
            $message =  get_post_meta($post->ID, "ok_product_closed_message", true);    
            if ($message) { 
                $i++;

                if ($i == 2)
                    echo '<div class="prod-warnings"><ul id="warnings" class="morethanone">';
                else
                    echo '<div class="prod-warnings"><ul id="warnings">';


                echo '<li>'.$message.'</li>'; 
            }                  
        endwhile;
        if ($i > 0) {
            echo '</ul></div>'; 
        }
    }

}
?>

答案 1 :(得分:0)

基本上, break 允许您在获得预期数据后立即退出循环:无需再循环(不会将任何内容更改为结果 - 但不会吃掉任何CPU)


至于为什么你不进入第二个循环,我不确定(我不知道你正在使用的类),但我会说用{{1加载数据可能会在the_post()对象中使一些内部指针前进。

当指针足够高时,没有任何项目可以循环。
在第二个循环之前,您似乎没有重新初始化内部指针