PHP上次循环

时间:2011-01-28 14:18:50

标签: 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; ?>

现在我想要为最后一个循环更改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 -->

无论有多少数组元素,我都在寻找能够发挥作用的东西。

坦克!

7 个答案:

答案 0 :(得分:5)

这里有很多答案但没有提到$wp_query->post_count$wp_query->current_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; ?>

答案 1 :(得分:4)

<?php
$num_rows = mysql_num_rows($result1);
$i = 0;
while ($row = mysql_fetch_array($result1, MYSQL_ASSOC)) {
    $i++;
    /*
    your code
     */
    if ( $i == ( $num_rows - 1 ) )
        //you're on last line...    
}
?>

取自http://www.phpbuilder.com/board/showthread.php?t=10359504,只需根据您的需要进行调整,您就可以轻松更改循环中的最后一次迭代

答案 2 :(得分:1)

您可以使用WP_query对象。您有两个有用的实例(post_count和current_post)。

// Example
<?php $query = new WP_Query(array('cat' => 112));
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>

然后

<div class="post<? if(($query->current_post + 1) == $query->post_count) echo ' last'?>">

简单快捷。 ;)

答案 3 :(得分:0)

你能做的最好的事情可能就是把最后的调用放在while循环之外,并改变你的while循环逻辑,以便它尽早退出。而不是:

while ($post = getPost()) {
    printPost($post);
}

做类似

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

编辑:我一直在假设您不知道帖子的数量,直到您迭代它们为止,并且返回帖子直到用尽的界面是唯一一个可用。如果您有一个计数并且可以通过编号访问它们,那么其他建议将正常工作。事实上,如果你可以指望帖子的数量很少,那么你最好只是将它们读入一个数组,并使用for循环而不是while循环。

答案 4 :(得分:0)

<?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; ?>

答案 5 :(得分:0)

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

<?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
    }
 }
 ?>

答案 6 :(得分:0)

while ( $loop->have_posts() ) : $loop->the_post();

之后的循环中使用此代码
<?php
$postCount = 0;

// Start of The Loop

if (++$postCount == 1) {
     // FIRST POST
} 

if ($postCount == sizeof($posts)) {
     // LAST POST IN LOOP
}

// End of The Loop
?>

来源:
http://wordpress.org/support/topic/last-post-in-the-loop?replies=4#post-954762