三元运算符的简写,在真/假子句中使用表达主语而不是重复

时间:2013-11-14 12:48:04

标签: php expression ternary-operator

假设我有一个long(ish)变量$row['data']['manybullets']['bullets']['bullet'][0],并想测试是否使用三元运算符设置它:

$bulletx = 
    isset($row['data']['property']['bullets']['bullet'][0])    // condition
    ? $row['data']['property']['bullets']['bullet'][0]         // true
    : 'empty';                                                 // false

反正我是否可以参考表达的主题而不是重复它。例如。

$bulletx = 
    isset($row['data']['property']['bullets']['bullet'][0])    // condition
    ? SUBJECT                                                  // true
    : 'empty';                                                 // false    

好奇。

4 个答案:

答案 0 :(得分:5)

PHP支持foo ?: bar,但遗憾的是,由于您处于isset()状态,因此无效。

所以不幸的是,没有什么好方法可以用更短的方式来做到这一点。除了当然使用另一种语言(例如python中的foo.get(..., 'empty')

但是,如果在任何情况下评估的默认值都不是问题(例如,因为它只是一个静态值),您可以使用函数:

function ifsetor(&$value, $default) {
    return isset($value) ? $value : $default;
}

由于引用参数,如果未定义值,则不会抛出E_NOTICE。

答案 1 :(得分:2)

你可以这样做:

$bulletx = ($r=$row['data']['property']['bullets']['bullet'][0]) ? $r : 'empty';

请参阅working demo

答案 2 :(得分:1)

不是真的,没有触发E_NOTICE警告,但是如果你决定忽略那些你可以像这样实现它。

$bulletx = 
    $row['data']['property']['bullets']['bullet'][0]    // true
    ?: 'empty';                                          // false    

答案 3 :(得分:1)

没有内置方式,但您可以为isset编写一个检查数组键的包装器。

function array_isset(&$array /* ... */) {
    $a = $array;
    if (! is_array($a)) {
        return false;
    }
    for ($i = 1; $i < func_num_args(); $i++) {
        $k = func_get_arg($i);
        if (isset($a[$k])) {
            $a = $a[$k];
        } else {
            return false;
        }
    }

    return $a;
}

$bulletx = array_isset($row, 'data', 'property', 'bullets', 'bullet', 0) ?: 'empty';

我喜欢这种方式,因为它与isset()保持相同的API并且可以使用?:捷径。