假设我有一个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
好奇。
答案 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并且可以使用?:捷径。