【问题标题】:PHP not processing second condition in ORPHP 不处理 OR 中的第二个条件
【发布时间】:2017-08-16 07:51:25
【问题描述】:

我搜索了很多,除了编写更大的代码之外找不到任何解决方案。 我需要的是,只有在设置了两个 $btn_ 字符串之一时才输出。

如果$btn_orange = get_field('btn_orange') 等于 true,则在当前状态下, ( $btn_black = get_field('btn_black') 没有被处理,而 get_field('btn_black') 返回一个好的值。

简而言之:如果$btn_orange 是,则$btn_black 不设置。

这是我当前的代码:

<?php if( ( $btn_orange = get_field('btn_orange') ) || ( $btn_black = get_field('btn_black') ) ): ?>

       <div class="buttons">

        <?php if($btn_orange && ( $btn_orange_url = get_field('btn_orange_url') ) ): ?>

            <a class="btn btn-lg btn-primary" href="<?php echo $btn_orange_url; ?>"><?php echo $btn_orange; ?></a>

        <?php elseif($btn_orange): ?>

            <span class="btn btn-lg btn-primary"><?php echo $btn_orange; ?></span>

        <?php endif;?>

        <?php if($btn_black && ( $btn_black_url = get_field('btn_black_url') ) ): ?>

            <a class="btn btn-lg btn-black" href="<?php echo $btn_black_url; ?>"><?php echo $btn_black; ?></a>

        <?php elseif($btn_black): ?>

            <span class="btn btn-lg btn-black"><?php echo $btn_black; ?></span>

        <?php endif;?>

    </div>

<?php endif; ?>

现在我可以在单独的 if 块中分隔 btn_orange$btn_black。 但如果两者之一或两者都设置为get_field() 的值,我需要输出&lt;div class="buttons"&gt;

我可以在第一个 if 语句中完成这个吗?

编辑:问题已解决。我不应该在 IF 语句中添加类似 $x = func($parameter) 的内容,而是首先填充字符串,正如 dougtesting.net 指出的那样。

【问题讨论】:

  • 您知道您使用的是 =(赋值运算符)而不是 ==(非严格比较运算符),对吧?

标签: php if-statement operators operands


【解决方案1】:

当 $btn_orange 为真时,$btn_black 不会填充 get_field('btn_black') 的值,因为 PHP 停止评估 IF 语句的其余部分,因为第一部分为真。

最好的解决方案是像这样在 IF 语句之前填充变量...

$btn_orange = get_field('btn_orange');
$btn_black = get_field('btn_black');

if($btn_orange || $btn_black) {
   etc...
}

那么这两个变量都可以在 if 语句中使用。

【讨论】:

  • 这成功了!你能解释一下为什么我在预填充字符串之前不能使用吗?我这样做的原因是编写“更短”的代码。我得出的结论是,在 if 中编写 $x = func('string') 只会将执行移动到 if
  • 当然。是的,我知道您正在尝试编写更短的代码。这是因为在具有 OR (||) 条件的 IF 语句中,只有其中 1 个条件为 TRUE 才能满足条件并继续执行 if 语句中的代码。在您的情况下,当 $btn_orange 为真时,声明并为 $btn_black 赋值的代码从未执行。
  • 我发现它总结了它的工作原理:PHP 的 &&、|| 和、和或运算符被实现为“短路”运算符。一旦找到一个强制整体条件结果的条件,后续条件的评估就会停止。
【解决方案2】:

对于条件检查,您必须使用 == 而不是 =

if( ( $btn_orange == get_field('btn_orange') ) || ( $btn_black == get_field('btn_black')

【讨论】:

  • 这打破了整个声明
  • @odiw 这意味着
  • @Jens 我认为 OP 想要为这些变量赋值并检查这些变量在条件内是否为假。
  • @Jens 这意味着你写的不等于TRUE 并在我的情况下停止执行
【解决方案3】:

您正在使用单个 = 来检查您的 if 语句 ==

【讨论】:

  • 是的,如果我使用==,它会导致FALSE
【解决方案4】:

在条件内赋值不是一个好主意。条件并不意味着这样做(这就是大多数其他编程语言明确禁止这样做的原因)。

这样做:

<?php $btn_orange = get_field('btn_orange'); 
      $btn_black = get_field('btn_black');
      if ($btn_orange || $btn_black): 
 ?>

如果无法满足或不满足条件,PHP(和大多数其他编程语言)将放弃条件评估。不这样做会浪费计算时间和资源。

同时考虑以下代码:

 if (isset($array["index"])) && $array["index"] == "something)

如果要评估两个条件,则此代码将中断,因为如果未设置索引,则访问它会引发错误。

【讨论】:

  • 对不起,我在你之前看到了 dougtesting.net 的答案。你的回答同样好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
相关资源
最近更新 更多