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

发布于 2024-11-08 16:26:49 字数 497 浏览 0 评论 0原文

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

让我们以这个数组为例,

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

当我调用它时,函数应该返回 true:

checkKey('lib','template','engine');
//> Checks if isset $config['lib']['template']['engine']

请注意,我的数组不仅仅是 3 维的。即使只有 1 个维度,它也应该能够进行检查:

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

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

I have a multidimensional array. I need a function that checks if a specified key exists.

Let's take this array

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

A function should return true when I call it with:

checkKey('lib','template','engine');
//> Checks if isset $config['lib']['template']['engine']

Note that my array isn't only 3 dimensional. It should be able to check even with only 1 dimension:

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

At the moment I am using an awful eval code, I would like to hear suggest :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

方觉久 2024-11-15 16:26:49
function checkKey($array) {
  $args = func_get_args();
  for ($i = 1; $i < count($args); $i++) {
    if (!isset($array[$args[$i]]))
       return false;
    $array = &$array[$args[$i]];
  }
  return true;
}

用法:

checkKey($config, 'lib', 'template', 'engine');
checkKey($config, 'genericSetting');
function checkKey($array) {
  $args = func_get_args();
  for ($i = 1; $i < count($args); $i++) {
    if (!isset($array[$args[$i]]))
       return false;
    $array = &$array[$args[$i]];
  }
  return true;
}

Usage:

checkKey($config, 'lib', 'template', 'engine');
checkKey($config, 'genericSetting');
多情癖 2024-11-15 16:26:49

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

第一个函数 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"

I created the following two functions to do solve the same problem you are having.

The first function check is able to check for one/many keys at once in an array using a dot notation. The get_value function allows you to get the value from an array or return another default value if the given key doesn't exist. There are samples at the bottom for basic usage. The code is mostly based on CakePHP's Set::check() function.

<?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"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文