У меня многомерный массив. Мне нужна функция, которая проверяет, существует ли указанный ключ.
Возьмем этот массив
$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"