【问题标题】:Reset variable at each iteration of PHP foreach loop在 PHP foreach 循环的每次迭代中重置变量
【发布时间】:2017-01-15 13:48:38
【问题描述】:

我本质上是使用一个 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>';
    }
}

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

【问题讨论】:

  • $ii = 0; 放在foreach(){} 循环之前,然后使用$title = get_the_title() . ' ' . ++$ii;。摆脱$ii的所有其他用途。

标签: php wordpress loops foreach while-loop


【解决方案1】:

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

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

看起来您的抓取帖子的功能正在重新抓取每个帖子,并且仅根据 $cat 的值通过in_category() 输出您需要的帖子。您的 $ii 计数器应该可以很好地重置,因为您在每次 foreach 迭代开始时将其显式设置为 1。

【讨论】:

  • 我对计数器重置有相同的假设,但它的行为并非如此!但是,将增量范围限定为我需要在其中完成的类别对我有用。对不起,如果这个问题有点模棱两可,但感谢您推动我朝着正确的方向前进! :)
  • 它正在重置,但您正在增加 $ii 即使您不在正确的类别中。这就是为什么您的输出会跳过前 3 个并在第二个类别中显示 4、5、6 的原因。如果 $ii 没有重置回 1,那么您的第二个类别将显示 7、8、9
【解决方案2】:

您可以在 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++;

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 2015-03-09
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2021-11-03
    相关资源
    最近更新 更多