Php while循环内的Break命令可防止第二个while循环运行

Php while循环内的Break命令可防止第二个while循环运行,php,Php,在这段代码中,第一个while循环只是检查带有$message字段的帖子数量是否超过一个。如果是,则定义变量$morethance,break应该退出循环,因为不再需要它。然后应该执行第二个while循环 但由于某些原因,第一个while循环中的中断会阻止第二个while运行 当然,我可以取消中断,这不是严格必要的,而且一切正常,但我希望有人向我解释为什么会发生这种情况 <?php function availability_warning () { global $post;

在这段代码中,第一个while循环只是检查带有$message字段的帖子数量是否超过一个。如果是,则定义变量$morethance,break应该退出循环,因为不再需要它。然后应该执行第二个while循环

但由于某些原因,第一个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>'; } 
}

?>

基本上,
中断
允许您在获得预期数据后立即退出循环:不再需要循环(这不会改变任何结果,但会白白消耗CPU)


至于为什么不进入第二个循环,我不确定(我不知道您正在使用的类),但我想说的是,在
$closed\u messages\u query
对象中,使用
the_post()
加载数据可能会使一些内部指针前进

当指针前进到足够的高度时,就没有项目可以循环了。

在第二个循环之前,您似乎没有重新初始化内部指针。

好的,您的问题不是break命令。 问题在于while条件。您可以使用“while($closed\u messages\u query->have\u posts())” 要在附加循环中使用同一查询,您需要“倒带”查询,否则它将从访问的最后一行继续

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

$closed_messages_query->rewind_posts();
在第一个
endwhile下的两个循环之间

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



也许
$closed\u messages\u query->have\u posts()
第二次返回false?是否需要在第二次while循环之前重置$closed\u messages\u query->have\u posts()指针?是否只有1或2篇文章与查询匹配?如果我删除break指令,第二个while运行正常,因此它看起来与查询无关,没有发布帖子,或者postsOP标题的数量实际上具有误导性。他知道
break
做什么,他想知道为什么第一个循环中的
break
会阻止第二个循环running@JohnP确切地如果你对一个更好或更清晰的标题有任何建议,请说。谢谢你,莫斯,但那是行不通的。我想检查与查询匹配的数量项目,并在ok_product_closed_消息字段中显示内容。您的代码仅检查是否有多个帖子与查询匹配。解决方案是在查询中检查这个,但是这是一个自定义的WP字段,我认为您不能使用WP\u查询来检查这些字段。无论如何,我相信有更好的方法来编写代码。另外,我的问题是break命令。如果我删除它,一切都会按预期进行,包括查询。稍微修复了代码并添加了另一个可能的小修复,请理解您对中断的使用是正确的,问题在于代码流,在某些情况下,循环将从中断处继续,在某些情况下,循环将重新启动(你在第一个场景中遇到了问题)。我相信这两种解决方案都能解决问题(当然,你可以修改我的代码以满足你的需要,或者给我一些数据(比如你正在处理的帖子列表和你期望的输出)。。。
<?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>'; 
        }
    }

}
?>