正确答案:
感谢代码宇宙
<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>
条件:
文章数量不确定,一定>5
每隔5篇文章,需要使用一个Box的div包裹(难点在此,第一次输出
你不可以把每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出
提要:
关于周神的回答
<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>
条件:
文章数量不确定,一定>5
每隔5篇文章,需要使用一个Box的div包裹(难点在此,第一次输出
你不可以把每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出
提要:
关于周神的回答
<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 '
<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"><code>define("POSTS_PER_GROUP", 5);
echo "div container start";
while (have_posts())
{
$posts_grouped = [];
for ($i=0; $i<posts_per_group have_posts get_post echo group start foreach as single post .>content;
}
echo "div group end";
}
echo "div container end"</posts_per_group></code></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"><code>if ( have_posts() ) :
global $wp_query;
while ( $splice_post = array_splice( $wp_query->posts, 0, 5 ) ) {
printf( '<div class="box">');
foreach( $splice_post as $key => $post ) {
setup_postdata( $post );
the_title();
}
printf( '</div>');
}
endif; </code></pre><div class="contentsignin">Salin selepas log masuk</div></div>
</div>