【问题标题】:understanding nested ternary operators [duplicate]理解嵌套三元运算符
【发布时间】:2013-09-04 11:00:02
【问题描述】:

我有这段代码不清楚,特别是三元的复杂使用 运营商

if (!$byField && is_numeric($v)){ // by ID
$r=$fromRow?
$fromRow:
($v?
dbRow("select * from pages where id=$v limit 1"):
array()
);
}

如果有人可以解释如何评估三元运算符的嵌套使用

【问题讨论】:

标签: php


【解决方案1】:

在代码中使用嵌套的三元运算符会增加不必要的复杂性。出于同样的原因,它不应该被使用。只需使用普通的 if-else 块代替。这更具可读性。

if (condition) {
    # code...
} 
else {
    # code...
}

回答你的问题:

$r = $fromRow ? $fromRow : ( $v ? dbRow("..."): array() );

上面的语句可以改写如下:

if (!$byField && is_numeric($v))
{ 
    if ($fromRow) 
    {
        $r = $fromRow;
    }
    elseif ($v) 
    {
        $r = dbRow("select * from pages where id=$v limit 1"):
    } 
    else 
    {
        $r = array();
    }
}

如您所见,它更具可读性。

【讨论】:

    【解决方案2】:

    考虑以下代码:

    <?php
        $a = true;
        $b = false;
        $c = true;
    
        echo (
            $a 
            ? 'A is true'
            : (
                $b 
                ? 'A is false, but B is true'
                : (
                    $c 
                    ? 'A is false, B is false, but C is true'
                    : 'A, B and C are all false'
                )
            )
        );
    ?>
    

    这很容易改写成这样:

    <?php
        if ($a) {
            echo 'A is true';
        } else {
            if ($b) {
                echo 'A is false, but B is true';
            } else {
                if ($c) {
                    echo 'A is false, B is false but C is true';
                } else {
                    echo 'A, B and C are all false';
                }
            }
        }
    ?>
    

    【讨论】:

    • 您的答案是正确且典型的,因为您保留了嵌套 if else 条件的层次结构
    【解决方案3】:
    if (!$byField && is_numeric($v)){ // by ID
      if ($fromRow) {
        $r = $fromRow;
      else if ($v) {
        $r = dbRow("select * from pages where id=$v limit 1"):
      } else {
        $r = array();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      相关资源
      最近更新 更多