PHP while last循环

PHP while last循环,php,while-loop,wordpress,Php,While Loop,Wordpress,我的代码如下: <?php $loop = some array with posts; while ( $loop->have_posts() ) : $loop->the_post(); ?> <div class="class"> <p>(data)</p> </div> <?php endwhile;

我的代码如下:

<?php $loop = some array with posts;
      while ( $loop->have_posts() ) : $loop->the_post(); ?>
            <div class="class">
                <p>(data)</p>
             </div>   
     <?php endwhile; ?>

(数据)

现在我想为最后一个循环更改div类(从“class”更改为“class2”)。怎么做

例如:

当“带帖子的数组”现在有4条记录时,我得到:

<div class="class"><p>data</p></div>
<div class="class"><p>data</p></div>
<div class="class"><p>data</p></div>
<div class="class"><p>data</p></div>
数据

资料

资料

资料

我想得到:

<div class="class"><p>data</p></div>
<div class="class"><p>data</p></div>
<div class="class"><p>data</p></div>
<div class="class2"><p>data</p></div> <!-- this one is different -->
数据

资料

资料

数据

我正在寻找的东西,将永远工作,无论有多少数组元素


坦克

您所能做的最好的事情可能是将最后一个调用放在while循环之外,并更改while循环逻辑,使其提前退出。而不是:

while ($post = getPost()) {
    printPost($post);
}
做点像

$last = getPost();
$post = getPost();
while ($post != null) {
    printPost($last);
    $last = $post;
    $post = getPost();
}
printSpecial($post);

编辑:我一直假设,在对帖子进行迭代之前,您不知道帖子的数量,并且只有在帖子用尽之前返回帖子的界面可用。如果您有一个计数,并且可以通过数字访问它们,那么其他建议就可以了。事实上,如果您可以指望帖子的数量很小,那么您最好将它们读入一个数组中,并使用
for
循环而不是
while
循环来执行。您最好将最后一个调用放在while循环之外,并更改while循环逻辑,使其提前退出。而不是:

while ($post = getPost()) {
    printPost($post);
}
<?php $loop = some array with posts;
      while ( $loop->have_posts() ) : $loop->the_post();
         $class = $loop->have_posts() ? 'class' : 'class2'; ?>
            <div class="<?php echo $class ?>">
                <p>(data)</p>
             </div>   
     <?php endwhile; ?>
做点像

$last = getPost();
$post = getPost();
while ($post != null) {
    printPost($last);
    $last = $post;
    $post = getPost();
}
printSpecial($post);
编辑:我一直假设,在对帖子进行迭代之前,您不知道帖子的数量,并且只有在帖子用尽之前返回帖子的界面可用。如果您有一个计数,并且可以通过数字访问它们,那么其他建议就可以了。事实上,如果您可以指望帖子的数量很小,那么您最好将它们读入一个数组中,并使用
for
循环,而不是
while
循环。


<?php $loop = some array with posts;
      while ( $loop->have_posts() ) : $loop->the_post();
         $class = $loop->have_posts() ? 'class' : 'class2'; ?>
            <div class="<?php echo $class ?>">
                <p>(data)</p>
             </div>   
     <?php endwhile; ?>


如果您可以控制$loop的数据结构,那么可以将int转换为迭代器,并在其上使用CachingIterator。如果不进行控制,则更复杂的方法可能是将迭代器构建为包装器:

<?php
class PostIterator implements Iterator {
    private $have_post;

    function __construct($loop) {
        $this->loop = $loop;
    }

    function rewind() {
        $this->have_post = $this->loop->have_posts(); // looks like we have to call "next" to get the first element, too
    }

    function next() {
        $this->have_post = $loop->have_posts();
    }

    function valid() {
        return $this->have_post;
    }

    function key() {
        return 0; // not used in this case, better implementation might have aocunter or such
    }

    function current() {
         return $this->loop->the_post();
    }
}

$ci = new CachingIterator(new PostIterator($loop)
foreach ($ci as $data) {
    if (!$ci->hasNext()) {
         // last element
    }
 }
 ?>

如果可以控制$loop的数据结构,可以将int转换为迭代器,并在其上使用CachingIterator。如果不进行控制,则更复杂的方法可能是将迭代器构建为包装器:

<?php
class PostIterator implements Iterator {
    private $have_post;

    function __construct($loop) {
        $this->loop = $loop;
    }

    function rewind() {
        $this->have_post = $this->loop->have_posts(); // looks like we have to call "next" to get the first element, too
    }

    function next() {
        $this->have_post = $loop->have_posts();
    }

    function valid() {
        return $this->have_post;
    }

    function key() {
        return 0; // not used in this case, better implementation might have aocunter or such
    }

    function current() {
         return $this->loop->the_post();
    }
}

$ci = new CachingIterator(new PostIterator($loop)
foreach ($ci as $data) {
    if (!$ci->hasNext()) {
         // last element
    }
 }
 ?>

在循环中使用此代码,紧跟在
之后($loop->have_posts()):$loop->the_post()


来源:

在循环中使用此代码,就在
之后,$loop->have_posts()):$loop->the_post()


来源:

您可以使用WP\u查询对象。您有两个有用的实例(post\u count和current\u post)

//示例
然后


您可以使用WP\u查询对象。您有两个有用的实例(post\u count和current\u post)

//示例
然后


这里有很多答案,但没有一个涉及到
$wp\u query->post\u count
$wp\u query->current\u post
这两个在循环中都很有用:

<?php 
$loop = array(); //some array with posts;
while ( $loop->have_posts() ) : 
    $loop->the_post();
    $class = 'class';
    if($loop->post_count == $loop->current_post+1){ // if this is the last item
        $class = 'class2';
    }?>
        <div class="<?php print $class ;?>">
            <p>(data)</p>
         </div>   
 <?php endwhile; ?>


这里有很多答案,但都没有提到
$wp\u query->post\u count
$wp\u query->current\u post
,这两个答案在循环中都很有用:

<?php 
$loop = array(); //some array with posts;
while ( $loop->have_posts() ) : 
    $loop->the_post();
    $class = 'class';
    if($loop->post_count == $loop->current_post+1){ // if this is the last item
        $class = 'class2';
    }?>
        <div class="<?php print $class ;?>">
            <p>(data)</p>
         </div>   
 <?php endwhile; ?>



你不能简单地使用
:最后一个类型的
选择器吗?我不确定,但你不能再次使用$loop->have_posts()来检查这是否是最后一个吗?@nikic Nope,它必须在PHP中完成/你能不能简单地使用一个
:类型的最后一个
选择器?我不确定,但你不能再次使用$loop->have_posts()来检查这是否是最后一个吗?@nikic Nope,它必须在PHP中完成/可能的副本注意到,这增加了一个额外的数据库命中每页,你可能要考虑运行<代码> mySqLyFuffChyLoad 在while循环之前,然后仅仅作用于结果数组来保存数据库HIT.HyyKaNall,这个问题与MySQL数据库无关,但这是我为O/P+1建议的循环位-用户只需要一个基本计数器(mysql部分不相关,只是示例的一部分)。如果提问者使用
wp\u query()
生成
$loop
,他们可以使用
$loop->post\u count
获得帖子总数。请注意,这为每个页面添加了一个额外的数据库命中,您可能需要考虑在while循环之前运行<代码> mySqLyFixChyLoad ,然后只对生成的数组进行操作以保存数据库HIT.HyyKaNaL,这个问题与MySQL数据库无关,但这是我为O/P+1建议的循环位-用户只需要一个基本计数器(mysql部分不相关,只是示例的一部分)。如果提问者使用
wp\u query()
生成
$loop
,他们可以使用
$loop->post\u count
获得帖子总数。请看。我想这是正确的答案,exept
current\u post
以零开始,而不是一,因此post\u count==current\u post永远不会为真。我猜这个更正确:
$loop->post\u count==($loop->current\u post+1)
谢谢@honk31未经测试的伪代码的问题是你实际上没有测试它,当然current\u post是一个索引值!我想这是正确的答案,exept
current\u post
以零开始,而不是一,因此post\u count==current\u post永远不会是真的。我猜这个更正确:
$loop->post\u count==($loop->current\u post+1)
谢谢@honk31未经测试的伪代码的问题是你实际上没有测试它,当然current\u post是一个索引值!