具有多个值的三元多条件

时间:2016-05-17 15:28:33

标签: php ternary-operator

尝试返回$ 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;

3 个答案:

答案 0 :(得分:1)

关于1

在PHP中,||没有按照您的期望来自JavaScript,因为结果将始终是一个布尔值。 ||隐含地将其操作数转换为布尔值并返回结果。

为了从PHP中的JavaScript获得等效的短路||,您可以使用?:(所谓的“Elvis运算符” - x ?: y是{的简写{1}}):

x ? x : y

我没有更改第一个$days = isset($dy['value']) || isset($days['value']) ? ($dy['value'] ?: $days['value']) : null; ,因为它确实是一个布尔操作,但我确实替换了第二个。

但是我认为你的代码中存在逻辑错误,因为如果你有||错误报告,如果设置E_NOTICE并且$days['value']不是$dy['value'],那么PHP会抱怨,因为即使$dy['value']您仍在访问isset($dy['value']) == false。所以你需要使用,例如:

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

(假设您还希望跳过一个值,如果它是假的 - 根据您使用||的方式看起来像它。)

如果您根本不关心通知错误(不鼓励!),您可以使用:

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

答案 1 :(得分:0)

你需要三元的任何特殊原因吗?在这种情况下,if 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 );

答案 2 :(得分:0)

我想这可能是你想要的:

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