我有一个多维数组。我需要一个检查指定键是否存在的函数。
我们来看看这个数组
$config['lib']['template']['engine'] = 'setted';
当我用以下函数调用函数时,函数应该返回true:
checkKey('lib','template','engine');
//> Checks if isset $config['lib']['template']['engine']
请注意,我的数组不仅仅是3维。它应该能够检查甚至只有一个维度:
checkKey('genericSetting');
//> Returns false becase $c['genericSetting'] isn't setted
目前我正在使用糟糕的eval
代码,我想听听建议:)
答案 0 :(得分:9)
function checkKey($array) {
$args = func_get_args();
for ($i = 1; $i < count($args); $i++) {
if (!isset($array[$args[$i]]))
return false;
$array = &$array[$args[$i]];
}
return true;
}
用法:
checkKey($config, 'lib', 'template', 'engine');
checkKey($config, 'genericSetting');
答案 1 :(得分:1)
我创建了以下两个函数来解决你遇到的同样问题。
第一个函数检查能够使用点表示法在数组中一次检查一个/多个键。 get_value 函数允许您从数组中获取值,或者如果给定的键不存在,则返回另一个默认值。底部有样品供基本使用。代码主要基于CakePHP的Set :: check()函数。
<?php
function check($array, $paths = null) {
if (!is_array($paths)) {
$paths = func_get_args();
array_shift($paths);
}
foreach ($paths as $path) {
$data = $array;
if (!is_array($path)) {
$path = explode('.', $path);
}
foreach ($path as $i => $key) {
if (is_numeric($key) && intval($key) > 0 || $key === '0') {
$key = intval($key);
}
if ($i === count($path) - 1 && !(is_array($data) && array_key_exists($key, $data))) {
return false;
}
if (!is_array($data) || !array_key_exists($key, $data)) {
return false;
}
$data =& $data[$key];
}
}
return true;
}
function get_value($array, $path, $defaultValue = FALSE) {
if (!is_array($path))
$path = explode('.', $path);
foreach ($path as $i => $key) {
if (is_numeric($key) && intval($key) > 0 || $key === '0')
$key = intval($key);
if ($i === count($path) - 1) {
if (is_array($array) && array_key_exists($key, $array))
return $array[$key];
else
break;
}
if (!is_array($array) || !array_key_exists($key, $array))
break;
$array = & $array[$key];
}
return $defaultValue;
}
// Sample usage
$data = array('aaa' => array(
'bbb' => 'bbb',
'ccc' => array(
'ddd' => 'ddd'
)
));
var_dump( check($data, 'aaa.bbb') ); // true
var_dump( check($data, 'aaa.bbb', 'aaa.ccc') ); // true
var_dump( check($data, 'zzz') ); // false
var_dump( check($data, 'aaa.bbb', 'zzz') ); // false
var_dump( get_value($data, 'aaa.bbb', 'default value') ); // "bbb"
var_dump( get_value($data, 'zzz', 'default value') ); // "default value"