具有多个值的三元多重条件


ternary multiple conditions with multiple values

尝试返回$dy或$days的值。有时设置$dy,有时设置$days。

例如:$dy['value']=45或$days['value']=75(只设置一个值)

但是,当我执行此语句时,该值始终等于1。如何返回$dy或$days的实际值。

$days = isset($dy['value']) || isset($days['value']) ? ($dy['value'] || $days['value']) : null;

关于1:

在PHP中,||不会做您可能期望从JavaScript中得到的事情,因为结果总是布尔值。||隐含地将其操作数转换为布尔值并返回结果。

要从PHP中的JavaScript中获得等效的短路||,可以使用?:(所谓的"Elvis运算符"-x ?: yx ? x : y的缩写):

$days = isset($dy['value']) || isset($days['value']) ? ($dy['value'] ?: $days['value']) : null;

我没有更改第一个||,因为它确实是一个布尔运算,但我确实替换了第二个。


然而,我认为你的代码中无论如何都有一个逻辑错误,因为如果你有E_NOTICE错误报告,如果设置了$days['value']而没有设置$dy['value'],PHP无论如何都会抱怨,因为即使isset($dy['value']) == false,你仍然在访问$dy['value']。因此,您需要使用,例如:

$days = (isset($dy['value']) ? $dy['value'] : null) ?: (isset($days['value']) ? $days['value'] : null);

(假设你也想跳过一个错误的值——根据你使用||的方式,它看起来像。)

如果你根本不在乎通知错误(不鼓励!),你可以使用:

$days = $dy['value'] ?: $days['value'] ?: null;

您需要三进制的特殊原因吗?在这种情况下,如果elseif可能会更干净、更容易阅读。

if ( isset($dy['value']) )
{
    $days = $dy['value'];
} elseif ( isset($days['value'] )
{
    $days = $days['value'];
}

如果它绝对必须是三元的,那么你需要三元中的三元:

$days = isset($dy['value']) ? $dy['value'] : (
            isset($days['value']) ? $days['value'] : null
        );

如果你使用的是PHP 5.3+(你应该是),这应该可以:

$days = $dy['value'] ?: ( $days['value'] ?: null );

我想这可能是你想要的:

$days = (isset($dy['value']) || isset($days['value'])) ? (isset($dy['value'])?$dy['value'] : $days['value'])) : null;