PHP三元运算符:if / else if / else with NULL,0和1

时间:2016-04-01 21:31:40

标签: php ternary-operator

我正在尝试简化此控制块:

if (!isset($mobileNumberHF['IS_VALID']) && $mobileNumberHF['IS_VALID'] != 0) {
  echo '<strong class="text-warning">Sin validar</strong>';
} else if ($mobileNumberHF['IS_VALID'] == 0) {
  echo '<strong class="text-danger">Inválido</strong>';
} else {
  echo '<strong class="text-success">Validado</strong>';
}

像这样:

$isValidMobileNum = $mobileNumHF['IS_VALID'];
$mobileNumStatusLabel = ($isValidMobileNum == 1) ? 'Valid' : (!isset($isValidMobileNum)) ? 'Hasn't been validated' : 'Invalid';

测试方案是$isValidMobileNum等于NULL, 0 or 1;

到目前为止,结果的变化方式我还在努力理解。有时输出为“有效”,有时为“无效”,有时“未经验证”

例如,对于$isValidMobileNum = 1我正在Invalid

3 个答案:

答案 0 :(得分:1)

它似乎不是一个正确的逻辑。
我想,我应该如下:

if (isset($mobileNumberHF['IS_VALID'])) {
  echo ($mobileNumberHF['IS_VALID'] != 0)? '<strong class="text-success">Validado</strong>' : '<strong class="text-danger">Inválido</strong>';
} else {
  echo '<strong class="text-warning">Sin validar</strong>';  
}

至于你的三元运算符:你在最后一个操作数中放错了括号。另外'Hasn't字还没有单引号。

$isValidMobileNum = 1;
$mobileNumStatusLabel = ($isValidMobileNum == 1) ? 'Valid' : (!isset($isValidMobileNum) ? 'Hasn\'t been validated' : 'Invalid');
echo $mobileNumStatusLabel; // "Valid"

答案 1 :(得分:0)

将括号放在嵌套的三元语句周围,以使输出更可靠:

$isValidMobileNum = $mobileNumHF['IS_VALID'];
$mobileNumStatusLabel = ($isValidMobileNum == 1) ? 'Valid' : ( (!isset($isValidMobileNum)) ? 'Hasn't been validated' : 'Invalid' );

这是我个人会使用的另一种选择(没有理由为什么它更好)

$mobilePhone = isset($mobileNumHF['IS_VALID']) ? $mobileNumHF['IS_VALID'] : -1;

$mobileNumStatusLabel = $mobilePhone ? 'Valid' : ($mobilePhone == 0 ? 'Invalid' : 'Hasn\'t been validated');

这种方式可以避免非法的偏移警告。

答案 2 :(得分:0)

为什么要对此逻辑使用速记语法?我的意思是......显然你已经对你的if else声明在做什么感到困惑。它是如何简化的?嵌套if / else语句的简写...这称为简化这些日子?对我而言,看起来你正在创建一个怪物,因为你想要编写更少的代码行。这不是简化,它的杂耍。

但是是......如果你想让它工作,你应该在你的嵌套if / else周围添加括号。

我会认真考虑使用普通的if / else但是......如果你不这样做,你的代码将无法维护......如果你需要在if / else之后添加更多逻辑怎么办?如果有人在追踪错误时遇到这行代码会怎么样?