Доступ к произвольно глубокому ключу в многомерном массиве

Если у меня есть массив, содержащий ['key1', 'key2', 'key3'] , есть ли способ сопоставить это с массивом $array['key1']['key2']['key3'] без использования циклов или eval ()?

Пример массива:

 $var = [ 'key1' => [ 'subkey1' => [ 'finalkey' => 'value', ], 'subkey' => [ 'otherkey' => 'value', ], ], 'key2' => 'blah' ]; 

И тогда у меня есть массив вроде этого:

 $keys = ['key1', 'subkey1', 'finalkey'] 

или

 $keys = ['key1', 'subkey'] 

 function array_find($needle, &$haystack) { $current = array_shift($needle); if(!isset($haystack[$current])) { return null; } if(!is_array($haystack[$current])) { return $haystack[$current]; } return array_find($needle, $haystack[$current]); } 

Непроверенный, исходит из аналогичного ответа на другой вопрос.

 function get_value($dest, $path) { # allow for string paths of a/b/c if (!is_array($path)) $path = explode('/', $path); $a = $dest; foreach ($path as $p) { if (!is_array($a)) return null; $a = $a[$p]; } return $a; } 

Это должно работать лучше, чем рекурсивные решения.

Я применил следующий нерекурсивный метод для моей личной структуры :

 function Value($data, $key = null, $default = false) { if (isset($key) === true) { if (is_array($key) !== true) { $key = explode('.', $key); } foreach ((array) $key as $value) { $data = (is_object($data) === true) ? get_object_vars($data) : $data; if ((is_array($data) !== true) || (array_key_exists($value, $data) !== true)) { return $default; } $data = $data[$value]; } } return $data; } 

Применение:

 var_dump(Value($array, 'key1.subkey1.finalkey')); // or var_dump(Value($array, array('key1', 'subkey1', 'finalkey'))); 

Это может быть дополнительно упрощено путем удаления объекта и поддержки значений по умолчанию, а также других проверок.