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

时间:2012-03-04 14:41:08

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

在我的代码中

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

但是,如果我提供一个不存在的密钥,可以返回默认值,

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

11 个答案:

答案 0 :(得分:68)

我知道这是一个老问题,但我的谷歌搜索" 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
)

答案 1 :(得分:51)

从PHP 7开始,有一个专门为这些案例设计的新运算符,称为Null Coalesce Operator

现在你可以这样做:

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]);

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

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

答案 2 :(得分:19)

这应该可以解决问题:

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

如果你需要写很多东西,辅助函数会很有用:

function arr_get($array, $key, $default = null){
    return isset($array[$key]) ? $array[$key] : $default;
}

答案 3 :(得分:4)

你也可以这样做:

$value =  $items['four']['a'] ?: 99;

这相当于:

$value =  $items['four']['a'] ? $items['four']['a'] : 99;

它节省了将整个语句包装到函数中的需要!

请注意,当且仅当'a'中未设置键items['four']时,才会返回99。相反,当且仅当值$items['four']['a']为假(未设置或假值为0)时,它返回99.

答案 4 :(得分:3)

不是我知道的。

您必须单独检查isset

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

答案 5 :(得分:2)

使用Array_Fill()函数

http://php.net/manual/en/function.array-fill.php

$default = array(
              'a' => 1,
              'b' => 2,
              'c' => 3,
              'd' => 4,
         );
$arr = Array_Fill(1,3,$default);
print_r($arr);

结果如下:

Array
(
    [1] => Array
        (
            [a] => 1
            [b] => 2
            [c] => 3
            [d] => 4
        )

    [2] => Array
        (
            [a] => 1
            [b] => 2
            [c] => 3
            [d] => 4
        )

    [3] => Array
        (
            [a] => 1
            [b] => 2
            [c] => 3
            [d] => 4
        )

)

答案 6 :(得分:2)

问题很老,但也许我的解决方案仍然有用。对于我经常需要“if array_key_exists”的项目,例如Json解析,我开发了以下函数:

function getArrayVal($arr, $path=null, $default=null) {
    if(is_null($path)) return $arr;
    $t=&$arr;
    foreach(explode('/', trim($path,'/')) As $p) {
        if(!array_key_exists($p,$t)) return $default;
        $t=&$t[$p];
    }
    return $t;
}

然后您可以简单地“查询”数组,如:

$res = getArrayVal($myArray,'companies/128/address/street');

这比同等的老式方式更容易阅读...

$res = (isset($myArray['companies'][128]['address']['street']) ? $myArray['companies'][128]['address']['street'] : null);

答案 7 :(得分:0)

我不知道如何使用您提供的代码精确地执行此操作,但您可以使用接受任意数量参数的函数来处理它并返回您正在查找的参数或默认值。 / p>

用法:

echo arr_value($items, 'four', 'a');

或:

echo arr_value($items, 'four', 'a', '1', '5');

功能:

function arr_value($arr, $dimension1, $dimension2, ...)
{
    $default_value = 99;
    if (func_num_args() > 1)
    {
        $output = $arr;
        $args = func_gets_args();
        for($i = 1; $i < func_num_args(); $i++)
        {
            $outout = isset($output[$args[$i]]) ? $output[$args[$i]] : $default_value;
        }
    }
    else
    {
        return $default_value;
    }

    return $output;
}

答案 8 :(得分:0)

您可以使用DefaultArray中的Non-standard PHP library。您可以从项目中创建新的DefaultArray:

use function \nspl\ds\defaultarray;
$items = defaultarray(function() { return defaultarray(99); }, $items);

或者从items()函数返回DefaultArray:

function items() {
    return defaultarray(function() { return defaultarray(99); }, 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,
         ),
    ));
}

请注意,我们使用匿名函数function() { return defaultarray(99); }创建嵌套的默认数组。否则,将在所有父数组字段之间共享默认数组对象的相同实例。

答案 9 :(得分:-1)

在PHP7中,正如Slavik所提到的,您可以使用空合并运算符:??

链接到PHP docs

答案 10 :(得分:-1)

当前使用php 7.2

>>> $a = ["cat_name"=>"Beverage", "details"=>"coca cola"];
=> [
     "cat_name" => "Beverage",
     "details" => "coca cola",
   ]
>>> $a['price']
PHP Notice:  Undefined index: price in Psy Shell code on line 1
=> null
>>> $a['price'] ?? null ? "It has price key" : "It does not have price key"
=> "It does not have price key"