如果key不存在,则为默认数组值?

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)

  • 我不敢相信它是2013年,并且没有本土功能.两次输入整个表达式有什么意义? (40认同)
  • 我希望我可以将PHP本身用于没有更好的方法来处理这个问题. (31认同)
  • 是的,很难相信PHP没有类似的东西:```$ array-> get($ key,$ default)``` (4认同)
  • 我认为您应该使用`array_key_exists`而不是`isset`进行测试,因为设置为空值的键仍应被视为已设置. (3认同)

Eri*_*yte 7

从 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 。

  • 这将检查 ```$items['four']['a']``` 的值而不是它的存在。这与使用isset进行检查非常不同。 (7认同)
  • 如果 `$items['four']['a']` 的值为 **0** 或 **FALSE** 会怎样。 (2认同)