cgw*_*cts 42 php arrays default
如果我有一个充满信息的数组,如果密钥不存在,是否有任何方法可以返回值的默认值?
function items() {
return array(
'one' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
'two' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
'three' => array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
),
);
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中
$items = items();
echo $items['one']['a']; // 1
Run Code Online (Sandbox Code Playgroud)
但是,如果我提供一个不存在的密钥,我可以返回一个默认值,
$items = items();
echo $items['four']['a']; // DOESN'T EXIST RETURN DEFAULT OF 99
Run Code Online (Sandbox Code Playgroud)
Hei*_*tad 70
我知道这是一个老问题,但我的谷歌搜索"php数组默认值"把我带到了这里,我想我会发布我正在寻找的解决方案,很可能它可以帮助别人.
我想要一个具有默认选项值的数组,可以被自定义值覆盖.我最终使用array_merge.
例:
<?php
$defaultOptions = array("color" => "red", "size" => 5, "text" => "Default text");
$customOptions = array("color" => "blue", "text" => "Custom text");
$options = array_merge($defaultOptions, $customOptions);
print_r($options);
?>
Run Code Online (Sandbox Code Playgroud)
输出:
Array
(
[color] => blue
[size] => 5
[text] => Custom text
)
Run Code Online (Sandbox Code Playgroud)
Sla*_*ser 57
从PHP 7开始,有一个专门为这些情况设计的新运算符,称为Null Coalesce Operator.
所以现在你可以这样做:
echo $items['four']['a'] ?? 99;
Run Code Online (Sandbox Code Playgroud)
代替
echo isset($items['four']['a']) ? $items['four']['a'] : 99;
Run Code Online (Sandbox Code Playgroud)
在PHP 7之前还有另一种方法可以做到这一点:
function get(&$value, $default = null)
{
return isset($value) ? $value : $default;
}
Run Code Online (Sandbox Code Playgroud)
以下将无问题地工作:
echo get($item['four']['a'], 99);
echo get($item['five'], ['a' => 1]);
Run Code Online (Sandbox Code Playgroud)
但请注意,使用这种方式,在非数组值上调用数组属性将引发错误.例如
echo get($item['one']['a']['b'], 99);
// Throws: PHP warning: Cannot use a scalar value as an array on line 1
Run Code Online (Sandbox Code Playgroud)
此外,还有一种情况会引发致命错误:
$a = "a";
echo get($a[0], "b");
// Throws: PHP Fatal error: Only variables can be passed by reference
Run Code Online (Sandbox Code Playgroud)
在最后,有一个丑陋的解决方法,但工作得很好(在某些情况下的问题,如下所述):
function get($value, $default = null)
{
return isset($value) ? $value : $default;
}
$a = [
'a' => 'b',
'b' => 2
];
echo get(@$a['a'], 'c'); // prints 'c' -- OK
echo get(@$a['c'], 'd'); // prints 'd' -- OK
echo get(@$a['a'][0], 'c'); // prints 'b' -- OK (but also maybe wrong - it depends)
echo get(@$a['a'][1], 'c'); // prints NULL -- NOT OK
echo get(@$a['a']['f'], 'c'); // prints 'b' -- NOT OK
echo get(@$a['c'], 'd'); // prints 'd' -- OK
echo get(@$a['c']['a'], 'd'); // prints 'd' -- OK
echo get(@$a['b'][0], 'c'); // prints 'c' -- OK
echo get(@$a['b']['f'], 'c'); // prints 'c' -- OK
echo get(@$b, 'c'); // prints 'c' -- OK
Run Code Online (Sandbox Code Playgroud)
Mār*_*dis 19
这应该做的伎俩:
$value = isset($items['four']['a']) ? $items['four']['a'] : 99;
Run Code Online (Sandbox Code Playgroud)
如果你需要写很多东西,辅助函数会很有用:
function arr_get($array, $key, $default = null){
return isset($array[$key]) ? $array[$key] : $default;
}
Run Code Online (Sandbox Code Playgroud)
从 PHP7.0 开始,您可以使用空合并运算符??
$value = $items['one']['two'] ?? 'defaut';
Run Code Online (Sandbox Code Playgroud)
对于 <5.6
你也可以这样做:
$value = $items['four']['a'] ?: 99;
Run Code Online (Sandbox Code Playgroud)
这相当于:
$value = $items['four']['a'] ? $items['four']['a'] : 99;
Run Code Online (Sandbox Code Playgroud)
它省去了将整个语句包装成一个函数的需要!
请注意,当且仅当密钥'a'未设置在items['four']. 相反,当且仅当值为$items['four']['a']false(未设置或类似 0 的 false 值)时,它才返回 99 。