php将相对url字符串解析为一个数组/对象

时间:2014-06-15 23:05:00

标签: php arrays split relative-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",
);

1 个答案:

答案 0 :(得分:2)

考虑到最深路径的深度d和路径数量,你可以在最坏情况下完成O(nk),只要查找是常量(在PHP中就是这种情况):< / p>

$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导航的成本将在一般时间复杂度中受益。