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

ternary multiple conditions with multiple values

正在尝试 return $dy 或 $days 的值。有时设置 $dy,有时设置 $days。

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

然而,当我执行这条语句时,值总是等于 1。 我怎样才能 return $dy 或 $days 的实际值。

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

关于1

在 PHP 中,|| 不会执行您可能期望来自 JavaScript 的操作,因为结果始终是布尔值。 || 隐含地将其操作数转换为布尔值并 returns 结果。

要从JavaScript中得到短路||在PHP中的等价物,你可以使用?:(所谓的"Elvis operator" - x ?: yx ? x : y 的 shorthand:

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

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


但是我认为您的代码中存在逻辑错误,因为如果您有 E_NOTICE 错误报告,如果 $days['value'] 已设置并且 $dy['value'] 不是,因为即使 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;

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

我想这可能是您想要的:

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