Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查是否有一个";“运行时”;多维数组键存在_Php_Arrays_Multidimensional Array - Fatal编程技术网

Php 检查是否有一个";“运行时”;多维数组键存在

Php 检查是否有一个";“运行时”;多维数组键存在,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个多维数组。我需要一个函数来检查指定的键是否存在 让我们以这个数组为例 $config['lib']['template']['engine'] = 'setted'; 当我使用以下命令调用函数时,该函数应返回true: checkKey('lib','template','engine'); //> Checks if isset $config['lib']['template']['engine'] 请注意,我的数组不仅仅是三维的。即使只有一个维度,它也应该能够进行检查:

我有一个多维数组。我需要一个函数来检查指定的键是否存在

让我们以这个数组为例

$config['lib']['template']['engine'] = 'setted';
当我使用以下命令调用函数时,该函数应返回true:

checkKey('lib','template','engine');
//> Checks if isset $config['lib']['template']['engine']
请注意,我的数组不仅仅是三维的。即使只有一个维度,它也应该能够进行检查:

checkKey('genericSetting');
//> Returns false becase $c['genericSetting'] isn't setted

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

我创建了以下两个函数来解决您遇到的相同问题

第一个函数check能够使用点符号一次检查数组中的一个/多个键。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"

是否保证
$config
为全局变量?
genericSetting
将在哪里?因为它现在不存在于您的示例
$config
中。@bolt:是的,在您的函数中,您只需执行
全局$config关于
检查键('genericSetting')
它应该返回false,因为正如您所说的,在array@yes123:好的。意思是当你通过
genericSetting
时,它会检查
$config['genericSetting']
,对吗?你看到这里给出的例子了吗:只是出于兴趣,
isset($config['lib']['template']['engine'])
?不要使用isset。使用数组\密钥\存在。isset===邪恶。@golez:唯一的区别是它们如何处理空值,而不是badHey@levu和llnk这个函数就是我要找的。但如果我需要通过添加第二个参数将数组键作为字符串发送,并且如果key exist为true,那么返回value,否则返回null值,你们能帮我吗。示例checkkey($config,'lib[template][engine]”)并在响应中设置。提前谢谢
checkKey($config, 'lib', 'template', 'engine');
checkKey($config, 'genericSetting');
<?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"