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

WBOY
Lepaskan: 2016-06-06 20:22:58
asal
1416 orang telah melayarinya

正确答案:
感谢代码宇宙

<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>
Salin selepas log masuk

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

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

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

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

<?php endwhile;wp_reset_query(); ?></code>
Salin selepas log masuk
Salin selepas log masuk

我需要输出的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>
Salin selepas log masuk
Salin selepas log masuk

条件:

  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>
Salin selepas log masuk
Salin selepas log masuk

这时候我的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>
Salin selepas log masuk
Salin selepas log masuk

这个方式的弊端是只能是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>
Salin selepas log masuk
Salin selepas log masuk

结果:

第一个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>
Salin selepas log masuk
Salin selepas log masuk
'; }

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

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

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

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

<?php endwhile;wp_reset_query(); ?></code>
Salin selepas log masuk
Salin selepas log masuk

我需要输出的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>
Salin selepas log masuk
Salin selepas log masuk

条件:

  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>
Salin selepas log masuk
Salin selepas log masuk

这时候我的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>
Salin selepas log masuk
Salin selepas log masuk

这个方式的弊端是只能是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>
Salin selepas log masuk
Salin selepas log masuk

结果:

第一个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>
Salin selepas log masuk
<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>
Salin selepas log masuk
'; }
<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>
Salin selepas log masuk
<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>
Salin selepas log masuk

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

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

';

//此处将循环输出多篇文章
$postCount++;
echo '
...
';
if( $postCount > 1 && $postCount% 5 == 1 ){
<code>echo '</code>
Salin selepas log masuk
';

}


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>
Salin selepas log masuk

?>

问题描述的有点简单啊。不过要计数起码要有个产量吧,设置一个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>
Salin selepas log masuk

烧脑可以,实际工程切勿如此耍巧。请老老实实的在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">Salin selepas log masuk</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">Salin selepas log masuk</div></div> </div>

Label berkaitan:
sumber:php.cn
Artikel sebelumnya:一段C语言程序从编译的到软件打开整个过程是怎样的? Artikel seterusnya:php-fpm - OSX PHP56 nginx 服务器 权限问题,导致php链接500错误
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Isu terkini
Topik-topik yang berkaitan
Lagi>
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan