【问题标题】:Check if a “run-time” multidimensional array key exists [duplicate]检查是否存在“运行时”多维数组键[重复]
【发布时间】:2011-08-30 15:05:32
【问题描述】:

可能重复:
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;

目前我正在使用糟糕的 eval 代码,我想听听建议:)

要动态检查密钥是否存在,可以使用以下代码:

$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];
}

【问题讨论】:

  • 很有用:stackoverflow.com/questions/6088115/… 这看起来不是更改设置的好方法。
  • 那是我自己的问题。而且他们不是 DUP,因为这个问题只是为了看看它是否被设置为不设置。下次阅读更好
  • 我猜如果 jeff 关闭它我会说什么 xD

标签: php


【解决方案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];
    }
}

【讨论】:

  • 如果代码看起来很漂亮,没有那些大的
  • 代码应该是高效的、可读的和可重用的——这让它变得漂亮。
【解决方案2】:

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

【讨论】:

  • 您可能希望将 foreach 循环更改为 for 以遍历所有给定的键。现在,当您使用 emty $c 调用 _c('lib template engine',true); 时,您将以 $c = array('lib' =&gt; true); 结束,即使调用 3 次也不会设置所需的键
  • 是的,空 $c 存在一些错误。我需要解决方案
  • @dev-null-dweller:编辑了回复。现在基于 var $setValue 将设置在正确的数组中
【解决方案3】:

首先,值得牢记的是 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]];
}

虽然上面的方法可以使用递归来处理任意数量的级别。

【讨论】:

  • 我没有在你的代码中找到一种递归方法来使其成为任意数字
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2016-08-28
  • 2019-03-05
  • 2011-07-05
  • 2016-09-19
  • 2013-10-25
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多