Проверьте, существует ли многомерный массив «run-time»

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

Возьмем этот массив

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

 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'); 

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

Первая проверка функции позволяет проверять один или несколько ключей одновременно в массиве с использованием точечной нотации. Функция 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"