Intereting Posts
div внутри php echo Профиль профиля пользователя Session_start Есть ли что-то вроде Dwoo-s {with} или {loop} в Smarty 3 или раньше? В моем php-скрипте более крупный файл занимает больше времени для загрузки и его привязки max_execution_time Что считается длительным временем выполнения? Создание разбивки на страницы в структуре yii как создать base64encoded строку из ресурса изображения Большие шестнадцатеричные значения с PHP hexdec Не удается найти индекс FULLTEXT, соответствующий списку столбцов (установлены индексы) циклический автоинкремент для каждого значения ключа Передача данных в buildForm () в Symfony 2.8 / 3.0 Выбор значений атрибутов на основе другого значения атрибута с помощью SimpleXML Несколько первичных ключей с Doctrine 1 и Symfony 1? Как в PHP добавить значения из одного массива в другой, когда их пары значений ключей совпадают? Apache mod_rewrite не смог удалить конечную косую черту

PHP flat array для вложенных в ]]

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

Пример:

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);