在嵌套数组中查找只有带键的字符串的值

时间:2010-08-23 19:45:54

标签: php arrays multidimensional-array

我有一个数组包含一些基本上像这样的设置:

$defaults = array(
   'variable' => 'value', 
   'thearray' => array(
                  'foo' => 'bar'
                  'myvar' => array('morevars' => 'morevalues');
                  );
);

在另一个文件中,我得到一个带有第一级密钥的字符串,并且它的子项用于检查是否附加了一个值。使用上面的数组,我会得到这样的结果:

$option = "thearray['myvar']['morevars']";

我需要保持这个字符串的格式与上面类似,因为我还需要将它传递给另一个保存到数据库的函数,并以数组的格式使用它。

我的问题是,有了上面的数组和字符串,我如何检查数组中给定键的存在和值? array_key_exists似乎不能在第一级以下工作。

2 个答案:

答案 0 :(得分:1)

您可以使用一个简单的函数来解析您的键字符串并检查数组:

function array_deep_exists($array, $key)
{
    $keys = preg_split("/'\\]|\\['/", $key, NULL, PREG_SPLIT_NO_EMPTY);
    foreach ($keys as $key)
    {
        if ( ! array_key_exists($key, $array))
        {
            return false;
        }
        $array = $array[$key];
    }

    return true;
}

// Example usage
$defaults = array(
    'variable' => 'value', 
    'thearray' => array(
        'foo' => 'bar',
        'myvar' => array('morevars' => 'morevalues')
    )
);
$option = "thearray['myvar']['morevars']";
$exists = array_deep_exists($defaults, $option);
var_dump($exists);  // bool(true)

最后,要获取值(如果存在),请返回$array,其中上面的内容返回true

请注意,如果您的数组可能包含false,那么在返回值时,您必须小心区分no-matching-value和成功的false值。

答案 1 :(得分:-1)

您需要eval此代码,并在eval字符串中使用isset函数,并且不要忘记在代码eval之前在正确的位置添加$ character

示例:

eval("echo isset(\$defaults['varname']['varname2']);")

这将回显0或1(false或true)你可以在eval中做任何事情,比如php源