如何才能使循环中的这种迭代条件通过函数工作?

时间:2016-04-04 作者:CK MacLeod

我希望一个元素出现在循环中,但只出现在某些点上。我可以直接在模板文件中提供条件(以“标志”的形式,在条件满足时设置,防止进一步的迭代),它可以工作,但当我通过函数生成相同的逻辑时,标志似乎没有设置。

换句话说,提供一个简化的(最简单的!)案例-以下工程-案例1:

while( have_posts() ) : the_post();

if ( $flag < 1 ) {
    echo \'Flag worked!\';
    $flag = 1;
}

/* all of the code producing a post */

endwhile;
以上工作如预期:“标志工作!”出现一次,再也不会出现

然而,如果——案例2——我像这样编写了一个函数,并将其添加到主题函数中。php。。。

function flag_it() {
   if ( $flag < 1 ) {
       echo \'Flag worked!\';
       $flag = 1;
   }
}
。。。然后将其放置在与第一个代码完全相同的位置,如下所示:

while( have_posts() ) : the_post(); 

flag_it();

/* all of the code producing a post */

endwhile;
“Flag worked”一词变成了谎言,出现在循环中的每个帖子之前。换言之,if条件不会评估$标志值,或者$标志值继续被视为NULL(因此,“$标志<;1”保持为true)。

我已经尝试过这个主题的各种变体,包括TRUE v FALSE、返回变量、声明为0的值等等,但都不起作用,或者,如果起作用的话!,将回答一个基本问题:为什么案例1有效,而案例2无效,是否有任何方法可以使案例2或类似它的标记条件通过函数工作提供?

1 个回复
最合适的回答,由SO网友:kovshenin 整理而成

问题是每当你打电话flag_it() 没有$flag 可用,所以它总是会导致“标志工作”。尝试改用静态变量:

function flag_it() {
    static $flag;
    if ( isset( $flag ) )
        return;

    $flag = true;
    echo \'Flag worked!\';
}
请注意,无论您在一次运行中调用此函数多少次,它总是只回显一次。如果要重置计数器,需要将其更改为接受某种类型的$reset 论点

您可以在此处阅读有关PHP中变量作用域的更多信息:http://php.net/manual/en/language.variables.scope.php

相关推荐

当in_the_loop()为假时,何时以及为什么is_Single(‘my_cpt’)为真?

我正在使用模板系统的示例代码。此地址的页码:http://project.test/my_cpt/hello-post/.无法理解原因is_singular( \'my_cpt\' ) 是true 虽然in_the_loop() 是false.在页面模板中The Loop "E;“工程”:if ( have_posts() ) { while ( have_posts() ) { the_post(); ?>