Установить многомерный массив по пути ключа из значений массива?

Извините за ужасное название, лучшее, что я мог подумать в то время! Скажем, у меня есть массив «пути»;

array('this', 'is', 'the', 'path')

Каким будет самый эффективный метод, чтобы в итоге получить массив ниже?

 array( 'this' => array( 'is' => array( 'the' => array( 'path' => array() ) ) ) ) 

Solutions Collecting From Web of "Установить многомерный массив по пути ключа из значений массива?"

Просто переберите его с чем-то вроде array_shift или array_pop:

 $inarray = array('this', 'is', 'the', 'path',); $tree = array(); while (count($inarray)) { $tree = array(array_pop($inarray) => $tree,); } 

Не проверено, но это основная его структура. Рекурсия также хорошо подходит для этой задачи. Кроме того, если вы не хотите изменять исходный массив:

 $inarray = array('this', 'is', 'the', 'path',); $result = array(); foreach (array_reverse($inarray) as $key) $result = array($key => $result,); 

Я использую две аналогичные функции для получения и установки значений по их пути в массиве:

 function array_get($arr, $path) { if (!$path) return null; $segments = is_array($path) ? $path : explode('/', $path); $cur =& $arr; foreach ($segments as $segment) { if (!isset($cur[$segment])) return null; $cur = $cur[$segment]; } return $cur; } function array_set(&$arr, $path, $value) { if (!$path) return null; $segments = is_array($path) ? $path : explode('/', $path); $cur =& $arr; foreach ($segments as $segment) { if (!isset($cur[$segment])) $cur[$segment] = array(); $cur =& $cur[$segment]; } $cur = $value; } 

Затем вы используете их следующим образом:

 $value = array_get($arr, 'this/is/the/path'); $value = array_get($arr, array('this', 'is', 'the', 'path')); array_set($arr, 'here/is/another/path', 23); 
 function buildArrayFromPath( $path ) { $out = array(); while( $pop = array_pop($path) ) $out = array($pop => $out); return $out; } 

Одно рекурсивное решение:

 function find_in_array(&$array, &$path, $_i=0) { // sanity check if ( !(is_array($array) && is_array($path)) ) return false; $c = count($path); if ($_i >= $c) return false; $k = $path[$_i]; if (array_key_exists($k, $array)) return ($_i == $c-1) ? $array[$k] : find_in_array($array[$k], $path, $_i+1); else return false; } 

Параметр $_i используется для внутреннего использования и не должен устанавливаться при вызове функции.

не очень элегантный. но он работает

$ start = array ('this', 'is', 'the', 'path')

$ result [$ start [0]] [$ start [1]] [$ start [2]] [$ start [3]] = array ();