PHP пока последний цикл - PullRequest
       4

PHP пока последний цикл

0 голосов
/ 28 января 2011

У меня есть код вроде:

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

5 голосов
/ 23 октября 2012

Здесь много ответов, но ни один не относится к $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; ?>
4 голосов
/ 28 января 2011
<?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 здесь, просто приспособьте это к своим потребностям, и вы можете легко изменить последнюю итерацию в цикле

1 голос
/ 17 марта 2011

Вы можете использовать объект 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'?>">

Легко и быстро. ;)

0 голосов
/ 28 января 2011

Используйте этот код в цикле, сразу после 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

0 голосов
/ 28 января 2011

Если у вас есть контроль над структурой данных $ 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
    }
 }
 ?>
0 голосов
/ 28 января 2011
<?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; ?>
0 голосов
/ 28 января 2011

Лучшее, что вы можете сделать, это, вероятно, поместить последний вызов вне цикла while и изменить логику цикла while, чтобы он выходил рано.Вместо:

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

сделать что-то вроде

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

Редактировать : я предполагаю, что вы не знаете количество сообщений, пока неперебрал их, и что интерфейс, который возвращает сообщения до тех пор, пока они не будут исчерпаны, является единственным доступным.Если у вас есть счет и вы можете получить доступ к ним по номеру, то другие предложения будут работать нормально.На самом деле, если вы можете рассчитывать на то, что количество постов будет небольшим, лучше всего просто прочитать их в массив и сделать это с циклом for, а не с циклом while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...