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
获得帖子总数。请看。我想这是正确的答案,exeptcurrent\u post
以零开始,而不是一,因此post\u count==current\u post永远不会为真。我猜这个更正确:$loop->post\u count==($loop->current\u post+1)
谢谢@honk31未经测试的伪代码的问题是你实际上没有测试它,当然current\u post是一个索引值!我想这是正确的答案,exeptcurrent\u post
以零开始,而不是一,因此post\u count==current\u post永远不会是真的。我猜这个更正确:$loop->post\u count==($loop->current\u post+1)
谢谢@honk31未经测试的伪代码的问题是你实际上没有测试它,当然current\u post是一个索引值!