php анализирует строки относительных URL-адресов в один массив/объект

Какое лучшее решение для разделения этих относительных ссылок

folder-1/folder-2/item-a.txt
folder-1/folder-2/item-b.txt
folder-1/folder-3/item-c.txt
folder-1/folder-3/item-a.txt
folder-1/item-f.txt
folder-1/folder-2
folder-1/folder-3
folder-1
item-b.txt
item-g.txt

в массив php?

$testArray = array(
    "folder-1/" => array(
        "folder-2" => array(
            "item-a.txt",
            "item-b.txt"
        ),
        "folder-3" => array(
            "item-a.txt",
            "item-c.txt"
        ),
        "item-f.txt"
    ),
    "item-b.txt",
    "item-g.txt",
);

person user1337432    schedule 15.06.2014    source источник
comment
возможный дубликат многомерного массива из строки   -  person Giacomo1968    schedule 16.06.2014


Ответы (1)


Учитывая глубину d самого глубокого пути и количество путей, вы можете сделать это довольно просто в худшем случае O (nk), при условии, что поиск является постоянным (что имеет место в PHP):

$root = array();

foreach ($I as $i) {
    $d =& $root;
    $P = explode("/", $i);

    foreach ($P as $p) {
        if (!array_key_exists($p, $d))
            $d[$p] = array();

        $d =& $d[$p];
    }
}

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

Тогда вы уверены, что каждая следующая запись должна быть добавлена ​​(поэтому array_key_exists-условие избыточно). Тогда вам просто нужен умный способ узнать, где разместить ваш «курсор» в $r. Этот код может быть немного сложнее.

Также я не совсем уверен, в какой момент стоимость предварительной обработки и навигации по $r выиграет от общей временной сложности.

person Dennis Degryse    schedule 16.06.2014
comment
Я, вероятно, должен добавить, что данная сложность не учитывает разделение строки. Тем не менее, в какой-то момент разделение будет необходимо, так что это не очень важно. - person Dennis Degryse; 16.06.2014