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

问题描述 投票:0回答:11

如果我有一个充满信息的数组,如果键不存在,有什么方法可以默认返回值?

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
php arrays default
11个回答
89
投票

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

85
投票

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

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

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

22
投票

这应该可以解决问题:

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

如果您必须大量编写这些内容,则辅助函数会很有用:

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

10
投票

自 PHP7.0 起

您可以使用 null 合并运算符

??

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

# or simply
echo $items['four']['a'] ?? 99;

自 PHP7.4 起

如果您想在数组键为空时额外分配默认值,则可以使用 null 合并赋值运算符

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

对于 PHP <=5.x

如果你能保证 'four' 和 'a' 键总是存在并且是 真值或假值,那么你可以使用中间部分为空的 三元运算符

?:

但是,如果不能保证数组键存在,这可能会给您带来错误,因此请小心使用

isset()
!empty()
检查(请参阅下面的长格式答案)。

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

所有版本的 PHP 都支持长格式 三元运算符:

$value = !empty($items['four']['a']) ? $items['four']['a'] : 99;
echo $value;

请注意,当且仅当未在

'a'
中设置键
items['four']
时,才不会返回 99。相反,当且仅当值
$items['four']['a']
未设置或为 假值 值(如空字符串 (
''
)、空数组、
NULL
0
FALSE)时,它才返回 99 
.


4
投票

这个问题很老了,但也许我的解决方案仍然有帮助。对于经常需要“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);

3
投票

据我所知没有。

您必须单独检查

isset

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

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
        )

)

0
投票

我不知道如何使用您提供的代码精确地完成此操作,但您可以使用接受任意数量的参数并返回您正在查找的参数或默认参数的函数来解决它。

用途:

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

0
投票

您可以使用非标准 PHP 库中的DefaultArray。您可以从您的项目创建新的 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); }
。否则,默认数组对象的同一实例将在所有父数组字段之间共享。


0
投票

目前使用 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"

-1
投票

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

??

链接到 PHP 文档

© www.soinside.com 2019 - 2024. All rights reserved.