4

假设我有一个 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

4 回答 4

5

PHP 支持foo ?: bar,但不幸的是,由于您的情况,这将不起作用isset()

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

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

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

由于引用参数,这不会在未定义值的情况下抛出 E_NOTICE。

于 2013-11-14T12:51:56.713 回答
2

你可以这样做:

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

查看工作演示

于 2013-11-14T12:59:39.403 回答
1

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

$bulletx = 
    $row['data']['property']['bullets']['bullet'][0]    // true
    ?: 'empty';                                          // false    
于 2013-11-14T12:52:57.490 回答
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,并且可以使用 ?: 捷径。

于 2013-11-14T13:09:36.417 回答