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

2022-08-30 10:19:07

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

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,
         ),
    );
}

在我的代码中

$items = items();
echo $items['one']['a']; // 1

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

$items = items();
echo $items['four']['a']; // DOESN'T EXIST RETURN DEFAULT OF 99

答案 1

我知道这是一个古老的问题,但我的Google搜索“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);
?>

输出:

Array
(
    [color] => blue
    [size] => 5
    [text] => Custom text
)

答案 2

从 PHP 7 开始,有一个专门为这些情况设计的新运算符,称为 Null 合并运算符

所以现在你可以做:

echo $items['four']['a'] ?? 99;

而不是

echo isset($items['four']['a']) ? $items['four']['a'] : 99;

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

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

以下内容将毫无问题地工作:

echo get($item['four']['a'], 99);
echo get($item['five'], ['a' => 1]);

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

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

此外,在某些情况下,将引发致命错误:

$a = "a";
echo get($a[0], "b");
// Throws: PHP Fatal error:  Only variables can be passed by reference

最后,有一个丑陋的解决方法,但效果很好(在某些情况下的问题如下所述):

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