检查是否存在“运行时”多维数组键

时间:2011-05-22 14:52:08

标签: php

  

可能重复:
  Check if a “run-time” multidimensional array key exists

您好,

我有一个多维数组。我需要一个函数来检查指定的键是否存在,如果没有设置值。

让我们拿一下这个数组

$config['lib']['template']['engine'] = false;

当我使用:

调用时,函数不应将值更新为true
checkAndSetKey('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];
}

3 个答案:

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