首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果key不存在,是否默认数组值?

如果key不存在,是否默认数组值?
EN

Stack Overflow用户
提问于 2012-03-04 22:41:08
回答 11查看 74.8K关注 0票数 50

如果我有一个充满信息的数组,有没有办法在键不存在的情况下设置返回值的默认值?

代码语言:javascript
复制
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,
         ),
    );
}

在我的代码中

代码语言:javascript
复制
$items = items();
echo $items['one']['a']; // 1

但是,如果我给出了一个不存在的键,是否可以返回一个默认值,

代码语言:javascript
复制
$items = items();
echo $items['four']['a']; // DOESN'T EXIST RETURN DEFAULT OF 99
EN

回答 11

Stack Overflow用户

发布于 2013-07-03 16:31:26

我知道这是一个老生常谈的问题,但是我在谷歌上搜索"php“就找到了这个问题,我想我应该把我想要的解决方案贴出来,可能会对其他人有所帮助。

我想要一个具有默认选项值的数组,这些值可以被自定义值覆盖。我最终使用了array_merge

示例:

代码语言:javascript
复制
<?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);
?>

输出:

代码语言:javascript
复制
Array
(
    [color] => blue
    [size] => 5
    [text] => Custom text
)
票数 83
EN

Stack Overflow用户

发布于 2016-10-29 18:01:03

在PHP7中,有一个专门为这些情况设计的新操作符,称为Null Coalesce Operator

所以现在你可以这样做:

代码语言:javascript
复制
echo $items['four']['a'] ?? 99;

而不是

代码语言:javascript
复制
echo isset($items['four']['a']) ? $items['four']['a'] : 99;

在PHP7之前,还有另一种方法可以做到这一点:

代码语言:javascript
复制
function get(&$value, $default = null)
{
    return isset($value) ? $value : $default;
}

下面的代码将正常工作,不会出现问题:

代码语言:javascript
复制
echo get($item['four']['a'], 99);
echo get($item['five'], ['a' => 1]);

但请注意,使用这种方式,在非数组值上调用数组属性将抛出错误。例如。

代码语言:javascript
复制
echo get($item['one']['a']['b'], 99);
// Throws: PHP warning:  Cannot use a scalar value as an array on line 1

此外,在某些情况下会抛出致命错误:

代码语言:javascript
复制
$a = "a";
echo get($a[0], "b");
// Throws: PHP Fatal error:  Only variables can be passed by reference

最后,有一个丑陋的变通方法,但几乎工作得很好(在某些情况下,如下所述的问题):

代码语言:javascript
复制
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
票数 75
EN

Stack Overflow用户

发布于 2012-03-04 22:45:52

这应该能起到作用:

代码语言:javascript
复制
$value =  isset($items['four']['a']) ? $items['four']['a'] : 99;

如果你必须大量编写这些代码,那么辅助函数将非常有用:

代码语言:javascript
复制
function arr_get($array, $key, $default = null){
    return isset($array[$key]) ? $array[$key] : $default;
}
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9555758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档