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

获取四维数组
$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);

如果元素不存在返回默认值
$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);
需要python版的可以查看这篇文章
原创文章,作者:小哆啦,如若转载,请注明出处:https://www.notevm.com/a/5979.html