Строка PHP для многоуровневого массива

Как преобразовать эту строку:

$arrKeys = ['lev1', 'lev2', 'lev3']; $val = 'foo'; 

В следующем массиве:

 Array ( [lev1] => Array ( [lev2] => Array ( [lev3] => foo ) ) ) 

* Количество ключей массива может отличаться. Каждый массив, кроме последнего, представляет массив.

Спасибо!

Нет необходимости в рекурсии:

 $arrKeys = array_reverse(['lev1', 'lev2', 'lev3']); $val = 'foo'; $result = $val; foreach ($arrKeys as $key) { $result = [$key => $result]; } print_r($result); // Array // ( // [lev1] => Array // ( // [lev2] => Array // ( // [lev3] => foo // ) // // ) // // ) 

Просто постройте массив изнутри.

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

 function nest(array $keys, $value) { if (count($keys) === 0) return $value; else return [$keys[0] => nest(array_slice($keys, 1), $value)]; } $result = nest(['key1', 'key2', 'key3'], 'foo'); print_r($result); // Array // ( // [key1] => Array // ( // [key2] => Array // ( // [key3] => foo // ) // ) // ) 

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

 function nest(array $keys, $value) { return array_reduce(array_reverse($keys), function($acc, $key) { return [$key => $acc]; }, $value); } $result = nest(['key1', 'key2', 'key3'], 'foo'); print_r($result); // Array // ( // [key1] => Array // ( // [key2] => Array // ( // [key3] => foo // ) // ) // ) 

Оба решения работают для любого количества ключей. Даже если $keys – пустой массив

 nest([], 'foo'); //=> 'foo' 

Это довольно похожий подход к другому итеративному ответу, но pops $arrKeys значение в конце массива $arrKeys а не реверсирует его в начале.

 $result = $val; // start with the innermost value while ($level = array_pop($arrKeys)) { $result = [$level => $result]; // build out using each key as a new level }