有没有更好的PHP方法从数组(字典)中按键获取默认值?

Python中,人们可以做到:

foo = {}
assert foo.get('bar', 'baz') == 'baz'

PHP 中,可以采用三进制运算符,如下所示:

$foo = array();
assert( (isset($foo['bar'])) ? $foo['bar'] : 'baz' == 'baz' );

我正在寻找高尔夫版本。我可以在PHP中做得更短/更好吗?

更新 [2020 年 3 月]:

assert($foo['bar'] ?? 'baz' == 'baz');

看来今天值得一Null coalescing operator ??

在下面的评论中找到 (+1)


答案 1

时间流逝,PHP也在不断发展。PHP 7 现在支持空合并运算符??

// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

答案 2

我刚刚想出了这个小助手函数:

function get(&$var, $default=null) {
    return isset($var) ? $var : $default;
}

这不仅适用于字典,也适用于所有类型的变量:

$test = array('foo'=>'bar');
get($test['foo'],'nope'); // bar
get($test['baz'],'nope'); // nope
get($test['spam']['eggs'],'nope'); // nope
get($undefined,'nope'); // nope

为每个引用传递以前未定义的变量不会导致错误。相反,通过引用传递$var将定义它并将其设置为 null如果传递的变量为 .,则还将返回默认值。另请注意垃圾邮件/鸡蛋示例中隐式生成的数组:NOTICEnull

json_encode($test); // {"foo":"bar","baz":null,"spam":{"eggs":null}}
$undefined===null; // true (got defined by passing it to get)
isset($undefined) // false
get($undefined,'nope'); // nope

请注意,即使通过引用传递,结果也将是 的副本,而不是引用。我希望这有帮助!$varget($var)$var