【问题标题】:Is it possible to set multiple variables with one ternary operator?是否可以使用一个三元运算符设置多个变量?
【发布时间】:2010-07-15 20:51:47
【问题描述】:

我想看看是否可以用一个三元运算符设置多个变量。我谷歌了一下,但没有想出任何东西。我开始测试一些想法,发现了一些接近的东西——但也得到了一些奇怪的行为;关于发生了什么的任何想法?而且,是否可以在单个三元运算中设置多个var?如果是这样,是否有适当的方法来做到这一点?

$i=9;
($i==9)?($w=3|$r=2):($w=7|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 3 r= 2


$i=9;
($i==9)?($w=4|$r=2):($w=7|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 6 r= 2


$i=9;
($i==9)?($w=3|$r=7):($w=7|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 7 r= 7


$i=444;
($i==9)?($w=4|$r=2):($w=7|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 7 r= 1


$i=444;
($i==9)?($w=4|$r=2):($w=1|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 1 r= 1 

谢谢...


编辑:

我做了更多的测试,发现这可以正常工作:

    ($i==9)?($w=4 AND $r=7):($w=7 AND $r=1);

但是,我不确定这是否正确。我很好奇第一个示例中发生了什么。

【问题讨论】:

    标签: php ternary-operator


    【解决方案1】:

    正如 Chadwick 所解释的,使用 ANDOR 逻辑运算符不会按照您希望的方式工作:

    $i = 0; $w = 0; $r = 0;
    ($i==9) ? ($w=4 AND $r=7) : ($w=7 AND $r=1);
    echo "w = $w, r = $r\n";
    // w = 7, r = 1
    
    $i = 0; $w = 0; $r = 0;
    ($i==9) ? ($w=0 AND $r=7) : ($w=0 AND $r=1);
    echo "w = $w, r = $r\n";
    // w = 0, r = 0
    

    但是,如果你真的想在一个语句中进行多个赋值,你可以使用list 构造:

    $i = 0; $w = 0; $r = 0;
    ($i==9) ?
        (list($w, $r) = array(4, 7)) :
        (list($w, $r) = array(7, 1));
    echo "w = $w, r = $r\n";
    // w = 7, r = 1
    
    $i = 0; $w = 0; $r = 0;
    ($i==9) ?
        (list($w, $r) = array(0, 7)) :
        (list($w, $r) = array(0, 1));
    echo "w = $w, r = $r\n";
    // w = 0, r = 1
    

    【讨论】:

      【解决方案2】:

      OR 运算符正在缩短您在三元表达式中所做的第二个分配。因此,如果第一个赋值为非零,则不会进行第二个赋值。

      如果您切换到 AND 语句(或 &&),则表达式中的第二个赋值仍然依赖于第一个:如果第一个赋值为 0(即 false),则表达式的后半部分AND 不被评估。这可能比第一个更难调试,因为第一个值为零可能很少见。它可能永远不会,这将永远有效......直到有一天......

      三元运算符只是if...else... 的简写,使用单个表达式而不是多个语句。如果您想要多个独立作业,我强烈建议您使用标准 if...else... 更易于阅读。

      【讨论】:

        【解决方案3】:

        我将尝试解释为什么您当前的代码表现得像它的行为。 首先要知道:| 是按位或运算符。第二件事要知道:| 的运算符优先级高于 =,因此首先执行。

        那么,让我们看一下第一个代码:$w=3|$r=2。根据运算符优先级,此代码可以这样编写:$w=(3|$r=2)。所以$r 得到正确设置,然后$w=3|2 被执行。双系统中的311210

          11
        | 10
        ====
          11
        

        所以结果是正确的。

        现在,我们来看第二个代码:

        $w=4|$r=2$w=(4|$r=2) 相同。正确设置$r,然后执行$w=4|2。双系统中41002010

          100
        | 010
        =====
          110
        

        而十进制中的1106

        所以,现在你知道错误的值来自哪里,现在让我们找到一个解决方案:

        不鼓励在此处使用&&,因为如果将第一个值设置为0,则根本不会设置第二个值。此外,它的运算符优先级错误:$w=1&&$r=2$w=(1&&$r=2) 相同。所以$w 将始终被分配truefalse

        一种可能的解决方案是使用xor 运算符。该运算符要求双方都执行,并且具有完美的优先级:

        $i == 9 ? ($w = 1 xor $r = 2) : ($w = 2 xor $r = 3);
        

        但是,您可能会想,这很难阅读,所以最好不要使用它...

        【讨论】:

        • +1 感谢您的出色解释。我读到单管道是按位运算符,但不知道它做了什么。有趣的东西。再次感谢!
        【解决方案4】:

        您缺少一个管道字符来形成OR 子句:

        ($i==9)?($w=3|$r=2):($w=7|$r=1);
        

        应该是:

        ($i == 9) ? ($w = 3 || $r = 2) : ($w = 7 || $r = 1);
        

        是的,可以看出您在其中使用了多个变量 $w$r

        【讨论】:

          猜你喜欢
          • 2019-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-20
          • 2021-11-16
          • 2013-03-12
          • 2016-09-26
          • 2021-10-06
          相关资源
          最近更新 更多