Home  >  Article  >  Backend Development  >  烧脑题,有一个程序循环逻辑问题,急在线等

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

WBOY
WBOYOriginal
2016-06-06 20:22:581326browse

正确答案:
感谢代码宇宙

$i=0;

    if ($i % 5 == 0) {
        echo '
'; } echo '
...
'; if ($i % 5 == 4) { echo '
'; } $i++; if ($i % 5 != 0) { echo ''; }

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

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



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

我需要输出的HTML格式如下

...
...
...
...
...
//一共五篇,也就是5个POST
...
...
...
...
...
...
...
...
...
...

条件:

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

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

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

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

...
...
...
...
...
...
...
...
...
...
...

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

我的尝试:

';$qp_a++;} ?> ...post ';} ?>

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

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

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

提要:
关于周神的回答

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

$postCount=0; //文章计数
echo '
'; //此处将循环输出多篇文章 $postCount++; if( $postCount > 1 && $postCount% 5 == 1 ){ echo '
'; }else{ echo '
...
'; } echo '
';

结果:

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

参考:

';
?>
 1 && $a % 5 == 1) {
        echo '
'; } else { echo '
内容
'; } } ?> '; ?>

效果:http://www.presscode.cn/temp.php

回复内容:

正确答案:
感谢代码宇宙

$i=0;

    if ($i % 5 == 0) {
        echo '
'; } echo '
...
'; if ($i % 5 == 4) { echo '
'; } $i++; if ($i % 5 != 0) { echo '
'; }

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

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



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

我需要输出的HTML格式如下

...
...
...
...
...
//一共五篇,也就是5个POST
...
...
...
...
...
...
...
...
...
...

条件:

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

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

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

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

...
...
...
...
...
...
...
...
...
...
...

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

我的尝试:

';$qp_a++;} ?> ...post ';} ?>

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

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

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

提要:
关于周神的回答

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

$postCount=0; //文章计数
echo '
'; //此处将循环输出多篇文章 $postCount++; if( $postCount > 1 && $postCount% 5 == 1 ){ echo '
'; }else{ echo '
...
'; } echo '
';

结果:

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

参考:

';
?>
 1 && $a % 5 == 1) {
        echo '
'; } else { echo '
内容
'; } } ?> '; ?>

效果:http://www.presscode.cn/temp.php

$i=0;
echo '
'; if ($i > 0 && $i % 5 == 0) { echo '
'; } echo '
...
'; $i++; echo '
';
$i=0;

    if ($i % 5 == 0) {
        echo '
'; } echo '
...
'; if ($i % 5 == 4) { echo '
'; } $i++; if ($i % 5 != 0) { echo '
'; }

    echo '
'; echo '
...
'; if (have_posts()) { the_post(); echo '
...
'; } else { echo '
'; break; } if (have_posts()) { the_post(); echo '
...
'; } else { echo ''; break; } if (have_posts()) { the_post(); echo '
...
'; } else { echo ''; break; } if (have_posts()) { the_post(); echo '
...
'; } echo '';

    echo '
'; echo '
...
'; if (have_posts()) { the_post(); echo '
...
'; if (have_posts()) { the_post(); echo '
...
'; if (have_posts()) { the_post(); echo '
...
'; if (have_posts()) { the_post(); echo '
...
'; } } } } echo '
';

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

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

';

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

}


echo '

';

$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 '
'; foreach($s as $key=>$val){ echo '
'.$val.'
'; } echo '
'; unset($s); $s = array(); $s[] = $v; }else{ $s[] = $v; } } if(count($s) > 0){ echo '
'; foreach($s as $key=>$val){ echo '
'.$val.'
'; } echo '
'; unset($s); }

?>

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

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

最终输出结构list

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

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

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

'.PHP_EOL);
define("DIV_CONTAINER_END",   ''.PHP_EOL);
define("DIV_BOX_START", '  '.'
'.PHP_EOL); define("DIV_BOX_END", ' '.'
'.PHP_EOL); define("DIV_POST_FORMAT", ' '.'
%s
'.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;

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

你需要一次取一批(5个或取到底),然后无脑套一个

分组输出。适合实际工程的循环方法(伪代码)应该是这样的:
define("POSTS_PER_GROUP", 5);
echo "div container start";
while (have_posts())
{
    $posts_grouped = [];
    for ($i=0; $icontent;
    }
    echo "div group end";
}
echo "div container end"

题主在题面中否定的“把每5个post存一下其他地方,然后最后一起输出”,其实在实际工程中恰恰是对的。别忘记就好。

我提供我的方法供参考:

if ( have_posts() ) :

    global $wp_query;

    while ( $splice_post = array_splice( $wp_query->posts, 0, 5 ) ) {

        printf( '
'); foreach( $splice_post as $key => $post ) { setup_postdata( $post ); the_title(); } printf( '
'); } endif;

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn