【问题标题】:Check if a "run-time" multidimensional array key exists检查是否存在“运行时”多维数组键
【发布时间】:2011-05-21 09:56:57
【问题描述】:

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

我们来看看这个数组

$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 代码,我想听听建议:)

【问题讨论】:

  • $config 保证是全局变量吗? genericSetting 会在哪里?因为它现在不存在于您的示例$config 中。
  • @bolt: 是的,在你的函数中你可以简单地做一个global $config; 对于checkKey('genericSetting'); 它应该返回false,因为正如你所说的数组中没有这个键
  • @yes123:好的。意味着当您通过genericSetting 时,它会检查$config['genericSetting'],对吗?
  • 你看到这里给出的例子了吗:php.net/manual/en/function.array-key-exists.php
  • 只是出于兴趣,isset($config['lib']['template']['engine']) 有什么问题?

标签: php arrays multidimensional-array


【解决方案1】:
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');

【讨论】:

  • 不要使用 isset。使用 array_key_exists。 isset===邪恶。
  • @golez:唯一的区别是他们如何处理还不错的 NULL 值
  • 嘿@levu 和 llnk 这个函数是我正在寻找的。但是,如果我需要通过添加第二个参数将数组键作为字符串发送并且如果键存在为真则返回值,否则你们可以帮助我吗?否则返回空值。 示例 checkkey($config , 'lib[template][engine]') 并设置为响应。 提前致谢
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 2011-07-05
    • 2013-10-25
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多