Coalesce并不是一个正确的单词,因为它返回第一个非NULL值,但希望它能传达意图。
是否有更可读,更简洁的方法从foo
,$arr
,然后$_GET
获取$_POST
的第一个定义值?
function foo($arr=array())
{
$arr['bar']=isset($arr['bar'])?$arr['bar']:(isset($_GET['bar'])?$_GET['bar']:(isset($_POST['bar'])?$_POST['bar']:NULL));
// ....
}
答案 0 :(得分:4)
array_merge是您正在寻找的功能。优先于最后一个参数数组。
$allData = array_merge($_POST, $_GET, $arr);
return $allData['bar'];
答案 1 :(得分:2)
使用array_merge
或+
运算符与数组有几个问题,假设存在已定义的偏移量,但该值恰好为空。
以下是三种不同的方法和每种方法的输出。
<?php
$a = ['foo' => null];
$b = ['foo' => 'bar_b'];
$c = ['foo' => 'bar_c'];
var_dump($a + $b + $c);
var_dump(array_merge($c, $b, $a)); //reverse order here!
function getFirstSetOffsetFromArrays($key, $arr) {
foreach($arr as $v) {
if (isset($v[$key]) && !empty($v[$key])) {
return $v[$key];
}
}
}
var_dump(getFirstSetOffsetFromArrays('foo', [$a, $b, $c]));
<强>输出:强>
array(1) { ["foo"]=> NULL }
array(1) { ["foo"]=> NULL }
string(5) "bar_b"
答案 2 :(得分:0)
这里有一些答案可行,但没有一个很好看:Using short circuiting to get first non-null variable
为变量修改上面的答案:
@$arr['bar'] = $arr['bar'] ?: $_GET['bar'] ?: $_POST['bar'] ?: NULL;
答案 3 :(得分:-1)
这里有几个很好的例子,但我更愿意:
$arr['bar'] =
current(filter_var_array($arr, ['bar' => FILTER_DEFAULT])) ?:
filter_input(INPUT_GET, 'bar', FILTER_DEFAULT) ?:
filter_input(INPUT_POST, 'bar', FILTER_DEFAULT) ?:
null;
@
。$_GET
和$_POST
时才有意义,否则会过于复杂。