У меня есть список путей (только строки), например:
$data = array(
array('path' => 'foo/bar/baz'),
array('path' => 'foo/bar/baz/qux'),
array('path' => 'foo/bar'),
array('path' => 'bar/baz/foo'),
array('path' => 'baz'),
);
Я хотел бы создать такую структуру
Array
(
[foo] => Array
(
[bar] => Array
(
[baz] => Array
(
[qux] => null
)
)
)
[bar] => Array
(
[baz] => Array
(
[foo] => null
)
)
[baz] => null
)
Примечание
null
(null
для меня было бы без детей)Я знаю, вы спросите меня, что вы пробовали? проблема в том, что я не знаю, как правильно решать проблему
Можете ли вы дать мне несколько советов, без резни нисходящего потока?
Я получил довольно близко, но вместо окончаний, null
, они представляют собой массив размером 0.
<?php
function ProcessPath($entry,$depth,&$current)
{
if($depth<count($entry))
{
$key = $entry[$depth];
if(!isset($current[$key]))$current[$key] = null;
ProcessPath($entry,$depth+1,$current[$key]);
}
}
$data = array(
array('path' => 'foo/bar/baz'),
array('path' => 'foo/bar/baz/qux'),
array('path' => 'foo/bar'),
array('path' => 'bar/baz/foo'),
array('path' => 'baz'),
);
$result = null;
foreach($data as $path)
{
ProcessPath(explode("/",$path['path']),0,$result);
}
print_r($result);
?>
вывод
Array
(
[foo] => Array
(
[bar] => Array
(
[baz] => Array
(
[qux] =>
)
)
)
[bar] => Array
(
[baz] => Array
(
[foo] =>
)
)
[baz] =>
)
По сути, функция ProcessPath принимает:
[foo]
(0) или foo > [bar]
(1) или foo > bar > [baz]
(2)&$reference
Сначала функция проверяет, находится ли глубина в текущем пути обработки.
Затем он извлекает $key
чтобы упростить остальную часть кода.
Здесь происходит волшебство, если на выходе нет текущего сегмента сегмента пути, он устанавливает его.
Последняя строка повторяет следующий элемент в записи пути $entry
, беря ту же $entry
, увеличивая $depth
на 1 и изменяя $current
в новый раздел $current[$key]
.
[]
на array()
(может быть языковая ошибка)
То, что вы можете сделать, это перебрать пути, взорвать строку каждого пути и затем добавить каждое значение в новый массив в зависимости от позиции значения. Если значение первое, тогда это будет база. Если он второй, то он входит в новый массив внутри первого и так далее.
[baz] =>
но у вас уже есть тот, который начинается с этого.null
(null
для меня было бы без детей)