【问题标题】:PHP Ternary Operator Misunderstanding? [duplicate]PHP 三元运算符的误区? [复制]
【发布时间】:2013-12-13 18:16:54
【问题描述】:

我不确定我所做的是否根本上是错误的,或者我是否刚刚度过了漫长的一天并且遗漏了一些明显的东西......

我正在像这样动态设置数组值:

$criteria = array(
    'is_blue' => get_color($color_1) == ('Dark Blue' OR 'Light Blue') ? TRUE : FALSE,
    'is_red'  => get_color($color_2) == ('Dark Red' OR 'Light Red') ? TRUE : FALSE
);

当我尝试以下行时,它会自行运行:

echo get_color($color_1);

我收到Dark Green。所以你会期望它在$criteria['is_blue'] 中评估为FALSE

但是 - $criteria['is_blue']TRUE

这是为什么?我误解了三元运算符吗?

谢谢!

【问题讨论】:

    标签: php ternary-operator


    【解决方案1】:

    您正确使用了三元运算符,但 if 部分格式错误。

    您实际上是在测试get_color($color_1) 是否等于true,因为'Dark Blue' OR 'Light Blue' 等于true

    您需要独立测试每个值,如下所示:

    $criteria = array(
        'is_blue' => get_color($color_1) == 'Dark Blue' OR get_color($color_1) == 'Light Blue' ? true : false,
        'is_red'  => get_color($color_2) == 'Dark Red' OR get_color($color_2) == 'Light Red' ? true : false
    );
    

    【讨论】:

    • 啊哈——明白了。很遗憾,在 PHP 中没有更优雅的输入方式,但没关系 - 谢谢。
    • 查看@Cole 的答案。更具可读性、优雅性和可扩展性:)
    • 这种技术是不可取的。不仅冗长,而且可能会迫使 php 多次使用相同的参数调用相同的函数
    • 此答案专门针对 OP 的原始代码。有关其他方法,请参阅 Cole's answerlinked similar question
    【解决方案2】:

    您的问题出在 ('Dark Blue' OR 'Light Blue') 部分。你可以重写它以使用 in_array...

    'is_blue' => in_array(get_color($color_1), array(('Dark Blue','Light Blue'))
    

    此外,您不会三元返回 truefalse,因为 in_array 已经自然地返回了。

    http://www.php.net/in_array

    【讨论】:

      【解决方案3】:

      您遇到的问题是 ('Dark Blue' OR 'Light Blue') 是布尔值(真或假)

      你需要使用两次相等性:

      $criteria = array(
          'is_blue' => get_color($color_1) == 'Dark Blue' OR get_color($color_1) == 'Light Blue' ? TRUE : FALSE,
          'is_red'  => get_color($color_2) == 'Dark Red' OR get_color($color_2) == 'Light Red' ? TRUE : FALSE
      );
      

      在这种情况下,三元运算符也是多余的,您可以使用:

      $criteria = array(
          'is_blue' => get_color($color_1) == 'Dark Blue' OR get_color($color_1) == 'Light Blue',
          'is_red'  => get_color($color_2) == 'Dark Red' OR get_color($color_2) == 'Light Red'
      );
      

      $criteria['is_blue'] 和 $criteria['is_red'] 将具有您想要的布尔值。

      希望对我有所帮助!

      【讨论】:

        【解决方案4】:

        试试这个:

        $criteria = array(
            'is_blue' => (get_color($color_1) == 'Dark Blue' OR get_color($color_1) == 'Light Blue') ? TRUE : FALSE,
            'is_red'  => (get_color($color_2) == 'Dark Red' OR get_color($color_2) == 'Light Red') ? TRUE : FALSE
        );
        

        if 中的每个比较都需要独立

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-30
          • 2014-05-03
          • 2017-05-15
          • 1970-01-01
          • 2013-01-21
          • 2014-04-20
          • 1970-01-01
          • 2013-06-24
          相关资源
          最近更新 更多