php - 烧脑题,有一个程序循环逻辑问题,急在线等
ringa_lee
ringa_lee 2017-04-10 16:26:21

正确答案:
感谢代码宇宙

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

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

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

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

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

<?php endwhile;wp_reset_query(); ?>

我需要输出的HTML格式如下

<p id="content">
    <p class="box">
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
        //一共五篇,也就是5个POST
    </p>
    <p class="box">
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
    </p>
    <p class="box">
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
        <p class="post">...</p>
    </p>
</p>

条件:

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

  2. 每隔5篇文章,需要使用一个Box的p包裹(难点在此,第一次输出<p class="box">,第五次输出</p>)

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

一个栗子

ringa_lee
ringa_lee

ringa_lee

全部回覆(7)
Ty80
$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 '

';
黄舟

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

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

'.PHP_EOL);
define("p_CONTAINER_END",   '

'.PHP_EOL); define("p_BOX_START", ' '.'

'.PHP_EOL); define("p_BOX_END", ' '.'

'.PHP_EOL); define("p_POST_FORMAT", ' '.'

%s

'.PHP_EOL); define("GROUP_BY", 5); $items = range(1, 11); // try changing $max to 9, 10, 11. echo p_CONTAINER_START; $written_to_dom = 0; foreach ($items as $item) // 本行相当于 while(have_posts()):the_post(); 即准备文章内容 { if ($written_to_dom % GROUP_BY == 0) { echo p_BOX_START; } echo sprintf(p_POST_FORMAT, $item); // 本行相当于 the_content(); 即输出文章内容 $written_to_dom += 1; if ($written_to_dom % GROUP_BY == 0) { echo p_BOX_END; } } // 本行相当于HTML/PHP混写时循环语法的 endwhile; 以及后边的 wp_reset_query(); if ($written_to_dom % GROUP_BY != 0) { echo p_BOX_END; } echo p_CONTAINER_END;

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

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

分组输出。适合实际工程的循环方法(伪代码)应该是这样的:

define("POSTS_PER_GROUP", 5);
echo "p container start";
while (have_posts())
{
    $posts_grouped = [];
    for ($i=0; $icontent;
    }
    echo "p group end";
}
echo "p container end"

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!