在 Python 中可以做到:
foo = {}
assert foo.get('bar', 'baz') == 'baz'
在 PHP 中,可以使用三元运算符,如:
$foo = array();
assert( (isset($foo['bar'])) ? $foo['bar'] : 'baz' == 'baz');
我正在寻找高尔夫版本。我能用PHP更短/更好吗?
答案 0 :(得分:43)
我刚刚想出了这个小助手功能:
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
每个引用传递一个先前未定义的变量不会导致NOTICE
错误。相反,通过引用传递$var
将定义它并将其设置为null
。如果传递的变量为null
,也将返回默认值。另请注意spam / eggs示例中隐式生成的数组:
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
请注意,即使$var
是通过引用传递的,get($var)
的结果也是$var
的副本,而不是引用。我希望这有帮助!
答案 1 :(得分:41)
时间流逝,PHP正在发展。 PHP7现在支持Null coalescing operator:
// 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 :(得分:18)
use error control operator @使用PHP 5.3快捷版本的三元运算符
$bar = @$foo['bar'] ?: 'defaultvalue';
答案 3 :(得分:7)
PHP 5.3有三元运算符的快捷方式:
$x = $foo ?: 'defaultvaluehere';
基本上是
if (isset($foo)) {
$x = $foo;
else {
$x = 'defaultvaluehere';
}
否则,不,没有更短的方法。
答案 4 :(得分:7)
我觉得创建这样的函数很有用:
function array_value($array, $key, $default_value = null) {
return is_array($array) && array_key_exists($key, $array) ? $array[$key] : $default_value;
}
并像这样使用它:
$params = array('code' => 7777, 'name' => "Cloud Strife");
$code = array_value($params, 'code');
$name = array_value($params, 'name');
$weapon = array_value($params, 'weapon', "Buster Sword");
$materia = array_value($params, 'materia');
echo "{ code: $code, name: $name, weapon: $weapon, materia: $materia }";
在这种情况下,默认值为null
,但您可以将其设置为您需要的任何值。
我希望它很有用。
答案 5 :(得分:5)
一种“略微”的hacky方式:
<?php
$foo = array();
var_dump('baz' == $tmp = &$foo['bar']);
$foo['bar'] = 'baz';
var_dump('baz' == $tmp = &$foo['bar']);
http://codepad.viper-7.com/flXHCH
显然,这并不是一个很好的方法。但在其他情况下它很方便。例如。我经常声明GET和POST变量的快捷方式:
<?php
$name =& $_GET['name'];
// instead of
$name = isset($_GET['name']) ? $_GET['name'] : null;
PS:可以称之为“内置==$_=&
特殊比较运算符”:
<?php
var_dump('baz' ==$_=& $foo['bar']);
PPS:嗯,你显然可以使用
<?php
var_dump('baz' == @$foo['bar']);
但这比==$_=&
运营商更糟糕。你知道,人们不太喜欢错误抑制操作符。
答案 6 :(得分:2)
如果您按数组中的键枚举默认值,则可以这样做:
$foo = array('a' => 1, 'b' => 2);
$defaults = array('b' => 55, 'c' => 44);
$foo = array_merge($defaults, $foo);
print_r($foo);
结果是:
Array
(
[b] => 2
[c] => 44
[a] => 1
)
您枚举默认值的键/值对越多,代码高尔夫变得越好。
答案 7 :(得分:0)
曾经有a solution proposed by "Marc B"使用三元快捷键$x = $foo ?: 'defaultvaluehere';
,但它仍然发出通知。也许这是一个迷惑,也许他的意思是?或者它是在PHP 7发行之前编写的。
根据{{3}}:
自PHP 5.3起,可以省略三元运算符的中间部分。如果
expr1 ?: expr3
的值为expr1
,则表达式expr1
返回TRUE
,否则返回expr3
。
但是它没有在内部使用isset
并产生通知。
为了避免出现通知,最好使用Ternary description ??
,它内部使用isset
。在PHP 7中可用。
表达式(expr1)??如果expr1为NULL,则(expr2)的计算结果为expr2,否则为expr1。 特别是,如果左侧值不存在,则该操作符不会发出通知,就像isset()一样。这在数组键上特别有用。
示例5分配默认值
<?php
// Example usage for: Null Coalesce Operator
$action = $_POST['action'] ?? 'default';
// The above is identical to this if/else statement
if (isset($_POST['action'])) {
$action = $_POST['action'];
} else {
$action = 'default';
}
?>