Проверьте, существует ли ключ многомерного массива во время выполнения - PullRequest
3 голосов
/ 21 мая 2011

У меня есть многомерный массив. Мне нужна функция, которая проверяет, существует ли указанный ключ.

Давайте возьмем этот массив

$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, я хотел бы услышать предложение:)

Ответы [ 2 ]

9 голосов
/ 21 мая 2011
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');
1 голос
/ 29 мая 2011

Я создал следующие две функции, чтобы решить ту же проблему, с которой вы столкнулись.

Первая функция check может проверять один / несколько ключей одновременно в массиве, используяточечная запись.Функция get_value позволяет получить значение из массива или вернуть другое значение по умолчанию, если данный ключ не существует.Внизу есть образцы для базового использования.Код в основном основан на функции Set :: check () CakePHP.

<?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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...