Поскольку заголовок с примером говорит, мне нужен плоский массив, который будет вложен каждым следующим ключом, являющимся предыдущим значением.
Пример:
array("I", "need", "this", "to", "be", "nested"); // To: array("I" => array("need" => array("this" => array("to" => array("be" => array("nested"))))))
Вот один из них, который просто изменяет исходный массив вместо создания новой переменной с помощью array_walk
:
$a = ["I", "need", "this", "to", "be", "nested"]; array_walk(array_reverse($a), function ($v, $k) use (&$a) { $a = $k ? [$v => $a] : [$v]; });
Если $a
пуст, это должно просто оставить его пустым. Однако он предполагает, что ваш входной массив имеет ключи, начиная с 0.
Вот возможная реализация:
<?php function make_nested($array) { if (count($array) < 2) return $array; $key = array_shift($array); return array($key => make_nested($array)); } print_r(make_nested(array("I", "need", "this", "to", "be", "nested")));
Если вам не нравится рекурсия, вот итеративная версия:
function make_nested($array) { if (!$array) return array(); $result = array(array_pop($array)); while ($array) $result = array(array_pop($array) => $result); return $result; }
Использование array_reduce
:
$a = ["I", "need", "this", "to", "be", "nested"]; $result = array_reduce(array_reverse($a), function($prevArray, $key){ return $prevArray ? [$key => $prevArray] : [$key]; }, null);
Обратите внимание, что мы используем array_reverse
потому что нет левого сокращения.
Рабочий пример: http://ideone.com/N61VtE
Я бы использовал for
-loop для этого 🙂
$array = array("I", "need", "this", "to", "be", "nested"); $newArray[$array[count($array)-2]] = array_pop($array); for($i = count($array) - 2; $i > -1; $i--) { $newArray[$array[$i]] = $newArray; unset($newArray[$array[$i+1]]); } print_r($newArray);
с$array = array("I", "need", "this", "to", "be", "nested"); $newArray[$array[count($array)-2]] = array_pop($array); for($i = count($array) - 2; $i > -1; $i--) { $newArray[$array[$i]] = $newArray; unset($newArray[$array[$i+1]]); } print_r($newArray);
Запустить код
<?php // nested_array(array, start_index, length) function nested_array($arr, $i, $size) { if ($i == ($size-1)) { return array($arr[$i] => array()); } return array($arr[$i] => nested_array($arr,($i+1),$size)); } print_r(nested_array(array("I", "need", "this", "to", "be", "nested"),0,6)); ?>
Кажется, это работает.
$a = array("I", "need", "this", "this", "to", "be", "nested"); $r = array($a[sizeof($a) - 1]); for ($i=sizeof($a)-2; $i >= 0; $i--) { $r = array($a[$i] => $r); } echo($ar == $r);