当前位置:Gxlcms > PHP教程 > 烧脑题,有一个程序循环逻辑问题,急在线等

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

时间:2021-07-01 10:21:17 帮助过:3人阅读

正确答案:
感谢代码宇宙

$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代码应该是怎么样的呢?

我的尝试:


    
        

            ...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代码应该是怎么样的呢?

我的尝试:


    
        

            ...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整除,最后必然剩下一组未封口。所以迭代结束后必须要有一个检查。

输出文章内容
    $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;    

人气教程排行