php封装获取数组值函数,支持多维数组

  • 2022.11.16
    • 可自定义键名的分割符,默认为【.】
  • 2023.02.15
    • 不使用递归,改成遍历keys判断

↓↓↓不看废话,直接拿代码↓↓↓


项目中经常需要判断数组某个元素是否存在,如果存在就获取元素的值,不存在则用默认值。

一开始是这样写的

if(isset($array['domain'])){
    $domain = $array['domain'];
}else{
    $domain = 'www.notevm.com';
}

或者用三元运算符

$url = isset($array['domain']) ? $array['domain'] : 'www.notevm.com';

后来为了方便,就封装了个函数来获取值

function getVal($array,$key,$default=false){
    if(isset($array[$key])){
        return $array[$key];
    }else{
        return $default;
    }
}

调用方法

$array = [
    'name' => '虚拟笔记',
    'domain' => 'www.notevm.com'
];
$name = getVal($array,'name');
print_r($name);
//输出 虚拟笔记

//如果元素不存在就返回默认值
$url = getVal($array,'url','https://www.notevm.com');
print_r($url);
//这里不存在url这个键名,就会输出设置的默认值:https://www.notevm.com

这样子用起来就方便多了,不过只能用于获取一维数组的值,遇到多维数组的话就不适用了。如果只是二维数组的话$name = getVal(getVal($array,'site'),'name');这样写虽然不好看,但也勉强能接受,但是遇到三维或者更多的话就接受不了了,不仅不美观,维护也难。于是又修改了下,增加支持多维数组获取,维护也方便。

最终代码

function getVal($array,$key,$default=false,$separator='.'){
    $keys = explode($separator,$key);
    foreach ($keys as $k) {
        if (!array_key_exists($k, $array)) {
            return $default;
        }
        $array = $array[$k];
    }
    return $array;
}

获取二维数组

$array = [
    'site' => [
        'name' => '虚拟笔记',
        'domain' => 'www.notevm.com'
    ]
];
$name = getVal($array,'site.name');
print_r($name);
php获取二维数组
测试二维数组

获取四维数组

$array = [
    'site' => [
        'name' => '虚拟笔记',
        'domain' => 'www.notevm.com',
        'page' => [
            'tags' => [
                'php' => 'https://www.notevm.com/a/tag/php'
            ]
        ]
    ]
];
$php = getVal($array,'site.page.tags.php');
print_r($php);
php获取四维数组
获取四维数组

如果元素不存在返回默认值

$linux = getVal($array,'site.page.tags.linux','https://www.notevm.com/a/tag/linux');
print_r($linux);
数组元素不存在返回默认值
元素不存在返回默认值

可以看到现在可以正常获取多维数组,代码也相对美观,维护也容易。

自定义分割符

如果数组的某个键名中包含【.】的话,可以自定义传入键名的分割符

$array = [
    'site' => [
        'name' => '虚拟笔记',
        'domain' => 'www.notevm.com',
        'page' => [
            'tags.php' => 'https://www.notevm.com/a/tag/php'
	],
    ],
];
$php = getVal($array,'site|page|tags.php',false,'|');
print_r($php);

原创文章,作者:小哆啦,如若转载,请注明出处:https://www.notevm.com/a/5979.html

(0)
小哆啦的头像小哆啦
上一篇 2022年5月31日 09:36
下一篇 2022年6月2日 22:47

相关推荐

发表回复

登录后才能评论