烧脑题,有一个程序循环逻辑问题,急在线等

WBOY
發布: 2016-06-06 20:22:58
原創
1416 人瀏覽過

正确答案:
感谢代码宇宙

<code>$i=0;
<?php while(have_posts()):the_post();?>
    if ($i % 5 == 0) {
        echo '<div class="box">';
    }
    echo '<div class="post">...</div>';
    if ($i % 5 == 4) {
        echo '</div>';
    }
    $i++;
<?php endwhile;wp_reset_query(); ?>
if ($i % 5 != 0) {
    echo '';
}</code>
登入後複製

原文内容:
注意,这是一个细思极恐的问题,请仔细阅题!

首先,有一个不能改变的条件,就是循环输出内容的代码,例如

<code><?php while(have_posts()):the_post();?>

//此处将循环输出多篇文章

<?php endwhile;wp_reset_query(); ?></code>
登入後複製
登入後複製

我需要输出的HTML格式如下

<code><div id="content">
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        //一共五篇,也就是5个POST
    </div>
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
    </div>
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
    </div>
</div></code>
登入後複製
登入後複製

条件:

  1. 文章数量不确定,一定>5

  2. 每隔5篇文章,需要使用一个Box的div包裹(难点在此,第一次输出

    ,第五次输出
  3. 你不可以把每5个post存一下其他地方,然后最后一起输出!

一个栗子?:
假设我有11篇文章,那么我的html最终格式应该是

<code><div id="content">
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
    </div>
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
    </div>
    <div class="box">
        <div class="post">...</div>
    </div>
</div></code>
登入後複製
登入後複製

这时候我的PHP代码应该是怎么样的呢?

我的尝试:

<code><div id="content">
    <?php while(have_posts()):the_post();$i++;?>
        <?php if($qp_i == 1 || $qp_i == 6 || $qp_i == 11 || $qp_i == 16){echo '<div class="box">';$qp_a++;} ?>

            ...post
            
        <?php if($qp_i == 5 || $qp_i == 10 || $qp_i == 15 || $qp_i == 20){echo '</div>';} ?>
    <?php endwhile;wp_reset_query(); ?>
</div></code>
登入後複製
登入後複製

这个方式的弊端是只能是IF里面规定的数值外,还必须是可以整除的文章数量。

可能你想到了用$i++ 之类的判断5次后输出,之类的,但是请注意,第一次循环需要echo出

这个标签的闭合需要在第五次输出后加上,也就是echo一个

提要:
关于周神的回答

<code>= =!!! 这不是很简单吗... 有毛难度啊

$postCount=0; //文章计数
echo '<div class="box">';
<?php while(have_posts()):the_post();?>
//此处将循环输出多篇文章
$postCount++;
if( $postCount > 1 && $postCount% 5 == 1 ){

echo '</div>
<div class="box">';
}else{

echo '<div class="post">...</div>';
}
<?php endwhile;wp_reset_query(); ?>
echo '</div>';</code>
登入後複製
登入後複製

结果:

第一个5个,第二三个4个,剩下空白

参考:

<code><?php $a == 0;
echo '<div class="box">';
?>
<?php for ($i = 0; $i < 16; $i++) {
    $a++;
    if ($a > 1 && $a % 5 == 1) {
        echo '<div class="box">';
    } else {
        echo '<div class="post">内容</div>';
    }
}
?>
<?php echo '<div>';
?>
<p>效果:http://www.presscode.cn/temp.php</p>

                            
                        


                                                                                                                        
                     <h2>回复内容:</h2>
                      
                                                            
<p>正确答案:<br>感谢代码宇宙</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><code>$i=0;
<?php while(have_posts()):the_post();?>
    if ($i % 5 == 0) {
        echo '<div class="box">';
    }
    echo '<div class="post">...</div>';
    if ($i % 5 == 4) {
        echo '</div>';
    }
    $i++;
<?php endwhile;wp_reset_query(); ?>
if ($i % 5 != 0) {
    echo '</code>
登入後複製
登入後複製
'; }

原文内容:
注意,这是一个细思极恐的问题,请仔细阅题!

首先,有一个不能改变的条件,就是循环输出内容的代码,例如

<code><?php while(have_posts()):the_post();?>

//此处将循环输出多篇文章

<?php endwhile;wp_reset_query(); ?></code>
登入後複製
登入後複製

我需要输出的HTML格式如下

<code><div id="content">
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        //一共五篇,也就是5个POST
    </div>
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
    </div>
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
    </div>
</div></code>
登入後複製
登入後複製

条件:

  1. 文章数量不确定,一定>5

  2. 每隔5篇文章,需要使用一个Box的div包裹(难点在此,第一次输出

    ,第五次输出
  3. 你不可以把每5个post存一下其他地方,然后最后一起输出!

一个栗子?:
假设我有11篇文章,那么我的html最终格式应该是

<code><div id="content">
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
    </div>
    <div class="box">
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
        <div class="post">...</div>
    </div>
    <div class="box">
        <div class="post">...</div>
    </div>
</div></code>
登入後複製
登入後複製

这时候我的PHP代码应该是怎么样的呢?

我的尝试:

<code><div id="content">
    <?php while(have_posts()):the_post();$i++;?>
        <?php if($qp_i == 1 || $qp_i == 6 || $qp_i == 11 || $qp_i == 16){echo '<div class="box">';$qp_a++;} ?>

            ...post
            
        <?php if($qp_i == 5 || $qp_i == 10 || $qp_i == 15 || $qp_i == 20){echo '</div>';} ?>
    <?php endwhile;wp_reset_query(); ?>
</div></code>
登入後複製
登入後複製

这个方式的弊端是只能是IF里面规定的数值外,还必须是可以整除的文章数量。

可能你想到了用$i++ 之类的判断5次后输出,之类的,但是请注意,第一次循环需要echo出

这个标签的闭合需要在第五次输出后加上,也就是echo一个

提要:
关于周神的回答

<code>= =!!! 这不是很简单吗... 有毛难度啊

$postCount=0; //文章计数
echo '<div class="box">';
<?php while(have_posts()):the_post();?>
//此处将循环输出多篇文章
$postCount++;
if( $postCount > 1 && $postCount% 5 == 1 ){

echo '</div>
<div class="box">';
}else{

echo '<div class="post">...</div>';
}
<?php endwhile;wp_reset_query(); ?>
echo '</div>';</code>
登入後複製
登入後複製

结果:

第一个5个,第二三个4个,剩下空白

参考:

<code><?php $a == 0;
echo '<div class="box">';
?>
<?php for ($i = 0; $i < 16; $i++) {
    $a++;
    if ($a > 1 && $a % 5 == 1) {
        echo '<div class="box">';
    } else {
        echo '<div class="post">内容</div>';
    }
}
?>
<?php echo '<div>';
?>
<p>效果:http://www.presscode.cn/temp.php</p>

                            
                        
            <p class="answer fmt" data-id="1020000004018944">
                                    
</p>
<pre class="brush:php;toolbar:false"><code>$i=0;
echo '<div class="box">';
<?php while(have_posts()):the_post();?>
    if ($i > 0 && $i % 5 == 0) {
        echo '</div>
<div class="box">';
    }
    echo '<div class="post">...</div>';
    $i++;
<?php endwhile;wp_reset_query(); ?>
echo '</div>';</code>
登入後複製
<code>$i=0;
<?php while(have_posts()):the_post();?>
    if ($i % 5 == 0) {
        echo '<div class="box">';
    }
    echo '<div class="post">...</div>';
    if ($i % 5 == 4) {
        echo '</div>';
    }
    $i++;
<?php endwhile;wp_reset_query(); ?>
if ($i % 5 != 0) {
    echo '</code>
登入後複製
'; }
<code><?php while(have_posts()):the_post();?>
    echo '<div class="box">';
    echo '<div class="post">...</div>';
    if (have_posts()) {
        the_post();
        echo '<div class="post">...</div>';
    } else {
        echo '</div>';
        break;
    }
    if (have_posts()) {
        the_post();
        echo '<div class="post">...</div>';
    } else {
        echo '';
        break;
    }
    if (have_posts()) {
        the_post();
        echo '<div class="post">...</div>';
    } else {
        echo '';
        break;
    }
    if (have_posts()) {
        the_post();
        echo '<div class="post">...</div>';
    }
    echo '';
<?php endwhile;wp_reset_query(); ?></code>
登入後複製
<code><?php while(have_posts()):the_post();?>
    echo '<div class="box">';
    echo '<div class="post">...</div>';
    if (have_posts()) {
        the_post();
        echo '<div class="post">...</div>';
        if (have_posts()) {
            the_post();
            echo '<div class="post">...</div>';
            if (have_posts()) {
                the_post();
                echo '<div class="post">...</div>';
                if (have_posts()) {
                    the_post();
                    echo '<div class="post">...</div>';
                }
            }
        }
    }
    echo '</div>';
<?php endwhile;wp_reset_query(); ?></code>
登入後複製

= =!!! 这不是很简单吗... 有毛难度啊

$postCount=0; //文章计数
echo '

';

//此处将循环输出多篇文章
$postCount++;
echo '
...
';
if( $postCount > 1 && $postCount% 5 == 1 ){
<code>echo '</code>
登入後複製
';

}


echo '

';

<code>$a = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
$s = array();
foreach($a as $k=>$v){
    if(count($s) === 5){ 
       echo '<div class="box">'; 
       foreach($s as $key=>$val){
           echo '<div class="post">'.$val.'</div>';
       }
       echo '</div>';
       unset($s);
       $s = array();
       $s[] = $v;
    }else{
        $s[] = $v;
    }
}
if(count($s) > 0){
    echo '<div class="box">'; 
    foreach($s as $key=>$val){
        echo '<div class="post">'.$val.'</div>';
    }
    echo '</div>';
    unset($s);
}</code>
登入後複製

?>

问题描述的有点简单啊。不过要计数起码要有个产量吧,设置一个i每输出一次i+1,自己尝试一下,这肯定不难实现吧

这个和我以前,做的显示图片一样,5张一列显示。
数据结构:
list

最终输出结构list

第二个listi的大小为5,把数据依次放到listi中,最后用listi放入list,页面输出listi就可以了。

规则其实不难梳理。盯住“已经写入DOM的节点数有多少个”,然后把适当的事件同时插入到节点写入DOM的前后,并不难做。

这个问题唯一的麻烦是:迭代过程中,我们无法知道本次迭代是最后一次。因此迭代结束后,如果总数不被5整除,最后必然剩下一组未封口。所以迭代结束后必须要有一个检查。

<code><?php header("Content-Type: text/plain");

define("DIV_CONTAINER_START", '<div class="container">'.PHP_EOL);
define("DIV_CONTAINER_END",   ''.PHP_EOL);
define("DIV_BOX_START", '  '.'<div class="box">'.PHP_EOL);
define("DIV_BOX_END",   '  '.'</div>'.PHP_EOL);
define("DIV_POST_FORMAT", '    '.'<div class="post">%s</div>'.PHP_EOL);
define("GROUP_BY", 5);

$items = range(1, 11); // try changing $max to 9, 10, 11. 

echo DIV_CONTAINER_START;
$written_to_dom = 0;
foreach ($items as $item) // 本行相当于 while(have_posts()):the_post(); 即准备文章内容
{
    if ($written_to_dom % GROUP_BY == 0) { echo DIV_BOX_START; }
    echo sprintf(DIV_POST_FORMAT, $item); // 本行相当于 the_content(); 即输出文章内容
    $written_to_dom += 1;
    if ($written_to_dom % GROUP_BY == 0) { echo DIV_BOX_END; }
} // 本行相当于HTML/PHP混写时循环语法的 endwhile; 以及后边的 wp_reset_query();
if ($written_to_dom % GROUP_BY != 0) { echo DIV_BOX_END; }
echo DIV_CONTAINER_END;</code>
登入後複製

烧脑可以,实际工程切勿如此耍巧。请老老实实的在V(View)层抛弃这种取一个输出一个的循环方式。

你需要一次取一批(5个或取到底),然后无脑套一个<div>分组输出。适合实际工程的循环方法(伪代码)应该是这样的: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;code&gt;define(&quot;POSTS_PER_GROUP&quot;, 5); echo &quot;div container start&quot;; while (have_posts()) { $posts_grouped = []; for ($i=0; $i&lt;posts_per_group have_posts get_post echo group start foreach as single post .&gt;content; } echo &quot;div group end&quot;; } echo &quot;div container end&quot;&lt;/posts_per_group&gt;&lt;/code&gt;</pre><div class="contentsignin">登入後複製</div></div> <p>题主在题面中否定的“<em>把每5个post存一下其他地方,然后最后一起输出</em>”,其实在实际工程中恰恰是对的。别忘记就好。</p> <p class="answer fmt" data-id="1020000004108164"> </p> <p>我提供我的方法供参考:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;code&gt;if ( have_posts() ) : global $wp_query; while ( $splice_post = array_splice( $wp_query-&gt;posts, 0, 5 ) ) { printf( '&lt;div class=&quot;box&quot;&gt;'); foreach( $splice_post as $key =&gt; $post ) { setup_postdata( $post ); the_title(); } printf( '&lt;/div&gt;'); } endif; &lt;/code&gt;</pre><div class="contentsignin">登入後複製</div></div> </div>

相關標籤:
來源:php.cn
上一篇:一段C语言程序从编译的到软件打开整个过程是怎样的? 下一篇:php-fpm - OSX PHP56 nginx 服务器 权限问题,导致php链接500错误
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
相關專題
更多>
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板