У меня есть я в тупике. Я искал и нашел похожие вопросы, но я не могу найти никаких вопросов, которые бы соответствовали моей точной проблеме.
В PHP у меня есть такой массив:
<?php $array = array('one', 'two', 'three', 'four'); ?>
Я хочу преобразовать это в многомерный массив следующим образом:
<?php $new_array = array('one' => array('two' => array('three' => array('four' => NULL)))); // or, to put another way: $new_array['one']['two']['three']['four'] = NULL; ?>
Принимая во внимание, что я не знаю, сколько элементов будет в исходном массиве, мне нужен способ рекурсивного создания многомерного связанного массива.
Казалось, что это легко сделать, но я не могу понять это.
Вы можете сделать это легко со ссылками:
$out = array(); $cur = &$out; foreach ($array as $value) { $cur[$value] = array(); $cur = &$cur[$value]; } $cur = null;
Печать $out
должна дать вам:
Array ( [one] => Array ( [two] => Array ( [three] => Array ( [four] => ) ) ) )
function recursive_array_convert ($input, &$result = array()) { $thisLevel = array_shift($input); if (count($input)) { if (!isset($result[$thisLevel]) || !is_array($result[$thisLevel])) { $result[$thisLevel] = array(); } recursive_array_convert($input, $result[$thisLevel]); } else { $result[$thisLevel] = NULL; } return $result; }
Эта функция должна дать вам большую гибкость – вы можете просто передать входной массив первому аргументу и поймать результат в возврате, или вы можете передать существующую переменную ко второму аргументу, чтобы он заполнил результат. Это означает, что вы можете достичь того, чего хотите в своем примере:
$result = recursive_array_convert(array('one', 'two', 'three', 'four'));
…или…
recursive_array_convert(array('one', 'two', 'three', 'four'), $result);
На первый взгляд может показаться малозначимым в этом варианте, но рассмотрим следующее:
$result = array(); recursive_array_convert(array('one', 'two', 'three', 'four'), $result); recursive_array_convert(array('five', 'six', 'seven', 'eight'), $result); print_r($result); /* Output: Array ( [one] => Array ( [two] => Array ( [three] => Array ( [four] => ) ) ) [five] => Array ( [six] => Array ( [seven] => Array ( [eight] => ) ) ) ) */
Как вы можете видеть, эту функцию можно использовать для создания целых цепей, как вам нравится в одной и той же переменной.