在PHP foreach循环的每次迭代中重置变量


Reset variable at each iteration of PHP foreach loop

我实际上使用foreach循环遍历一些帖子类别,然后为每个类别中的帖子输出一些标记。我原以为变量$ii会在foreach的每次迭代中被重置,但它会延续下去(这是我的愚蠢假设)。我确实需要$ii=1在每个循环的开始,有办法做到这一点吗?

基本代码结构
$cats = array(
    'cat1' => 20,
    'cat2' => 21,
    'cat3' => 22,
    'cat4' => 23
);
foreach($cats as $cat){
    $ii = 1;
    $cat_name = get_cat_name($cat);

    echo "<div class='container'>
            <h1>$cat_name</h1>
        ";
        while( have_posts() ) : the_post();
            $title = get_the_title() . ' ' . $ii;
            if( in_category($cat) ){
                echo "<p>$title</p>";
            }
        $ii++; endwhile;
    echo '</div>'; // end container
}

对于每个类别中的三个帖子,输出的内容基本上是:

Cat1
- title 1
- title 2
- title 3
Cat2
- title 4
- title 5
- title 6
etc. 

我想要的输出是:

Cat1
- title 1
- title 2
- title 3
Cat2
- title 1
- title 2
- title 3

是否有一种方法可以为每次迭代重置变量以实现我想要的输出?或者有更好的方法?还没在上面找到任何线索。虽然看起来很简单。提前感谢!

编辑:这里的一堆答案得到了一些工作,但将计数器限定到一个条件帮助我解决了我需要的问题。这是一种变通方法,但我基本上只需要检查我是否在特定类别的while循环的第5次迭代中,以便为特殊情况输出特定的标记块。(抱歉,如果我提出问题的方式让我的目标有点模糊,在我运行的实际循环中有很多事情要做——我想让它尽可能简单。)因此,到目前为止,解决方案看起来像这样:

if( $cat == $cats['cat2']){
    $ii++;
    if($ii === 5){
        echo '<hr>';
    }
}

仍然觉得有一种更强大的方式来实现这一点,我对新的想法持开放态度,但它目前正在工作!

不确定这些函数内部发生了什么,但尝试在in_category()条件检查中构建$title变量

if (in_category($cat)) {
    $title = get_the_title() . ' ' . $ii;
    echo "<p>$title</p>";
    $ii++;
}

看起来你的抓取帖子的函数再次重新抓取每个帖子,只输出你需要的基于$cat的值,通过in_category()。您的$ii计数器应该被重置得很好,因为您在每次迭代开始时显式地将其设置为1。

可以在while循环中增加另一个计数器,然后在while循环结束后增加另一个计数器:

$counter = 1;
while( have_posts() ) : the_post();
        $title = get_the_title() . ' ' . $counter;
        if( in_category($cat) ){
            echo "<p>$title</p>";
        }
        $counter++;
endwhile;
$ii++;