可能重复:
Check if a “run-time” multidimensional array key exists
您好,
我有一个多维数组。我需要一个函数来检查指定的键是否存在,如果没有设置值。
让我们拿一下这个数组
$config['lib']['template']['engine'] = false;
当我使用:
调用时,函数不应将值更新为truecheckAndSetKey('lib template engine',true);
//> Checks if isset $config['lib']['template']['engine'] and if not isset $config['lib']['template']['engine'] = true;
请注意,我的数组不仅仅是3维。它应该能够检查和设置即使只有一个维度:
checkAndSetKey('genericSetting',true);
//> In this considering there isn't any $c['genericSetting'] the function set the key to true;
目前我正在使用糟糕的评估代码,我想听听建议:)
要动态检查密钥是否存在,可以使用以下代码:
$array = $config;
$keys=explode(' ',$argument1);
foreach($keys as $v) {
if (!array_key_exists($v,$array)) {
//> [todo!] the current key doens't exist now we should set the value
}
$array = &$array[$v];
}
答案 0 :(得分:1)
稍作修改(将数组作为参考参数传递),这应该有效:
function checkAndSetKey(&$arr, $keys, $value){
$moreKeys = strpos($keys,' ');
if($moreKeys !== FALSE){
$currentKey = substr($keys, 0, $moreKeys);
$keys = substr($keys, $moreKeys+1);
if(!isset($arr[$currentKey]) || !is_array($arr[$currentKey]))
$arr[$currentKey] = array();
return checkAndSetKey($arr[$currentKey], $keys, $value);
}else{
$currentKey = $keys;
if(!isset($arr[$currentKey]))
$arr[$currentKey] = $value;
return $arr[$currentKey];
}
}
答案 1 :(得分:0)
首先,值得注意的是PHP数组不是多维的,它们是分层的。
PHP已经提供了一种测试array key exists的方法。在你自己的代码中包装它应该是微不足道的,特别是如果数组中的级别数量是固定的:
function checkAndSetKey(&$arr, $path, $default)
{
$path=explode(' ', $path);
if (!is_array($arr[$path[0]])) { // lib
$arr[$path[0]]=array();
}
if (!is_array($arr[$path[0]][$path[1]])) { // template
$arr[$path[0]][$path[1]]=array();
}
if (!array_key_exists($path[2],$arr[$path[0]][$path[1]])) { // engine
$arr[$path[0]][$path[1]][$path[2]]=$default;
}
return $arr[$path[0]][$path[1]][$path[2]];
}
虽然可以使用递归来调整上面的方法以处理任意数量的级别。
答案 2 :(得分:0)
LOL实际上这只是添加了一行代码= /
有一段时间,参考文献让我感到困惑。
这里是代码:
function _c($key,$value) {
global $c;
$array = &$c;
$keys = explode(' ',$key);
$setValue = false;
for($i=0;$i<count($keys);$i++) {
$v = $keys[$i];
//> If setValue is already = true we don't need to check it again
if (!$setValue && !array_key_exists($v,$array))
$setValue = true;
$array = &$array[$v];
}
if ($setValue)
$array = $value;
}
//> Usage _c('lib template engine',true);