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

2020/11/30 22:22 · php ·  · 0评论

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

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

我知道这是一个老问题,但是我在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
)

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

现在,您可以执行以下操作:

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

这应该可以解决问题:

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

如果您需要大量编写以下内容,则辅助功能将非常有用:

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

从PHP7.0开始,您可以使用null合并运算符??

$value = $items['one']['two'] ?? 'defaut';

对于<5.6

您也可以这样做:

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

这等于:

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

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

请注意,当且仅当'a'未在中设置密钥时,它不会返回99 items['four']相反,当且仅当该值为$items['four']['a']false(未设置或诸如0的false值)时,它才返回99

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

从来没听说过。

您必须单独检查 isset

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

使用Array_Fill()函数

http://php.net/manual/zh/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
        )

)

我不知道如何使用您提供的代码精确地做到这一点,但是您可以使用可以接受任意数量的参数并返回您要查找的参数或默认值的函数来解决该问题。

用法:

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

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

如Slavik所述,在PHP7中,可以使用null合并运算符: ??

链接到PHP文档

当前使用的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"
本文地址:http://php.askforanswer.com/ruguojianbucunzaizeweimorenshuzuzhi.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!