【问题标题】:Build Array Tree from URLs从 URL 构建数组树
【发布时间】:2010-06-22 14:48:40
【问题描述】:

我需要从给定的 url 构建一棵树(带有数组)。

我有以下网址列表:

http://domain.com/a/a.jsp
http://domain.com/a/b/a.jsp
http://domain.com/a/b/b.jsp
http://domain.com/a/b/c.jsp
http://domain.com/a/c/1.jsp
http://domain.com/a/d/2.jsp
http://domain.com/a/d/a/2.jsp

现在我需要一个这样的数组:

domain.com
  a
    a.jsp
    b
      a.jsp
      b.jsp
      c.jsp
    c
      1.jsp
    d
      2.jsp
      a
        2.jsp

我怎样才能用 php 做到这一点?

【问题讨论】:

  • 您能否使用 PHP 标准的 key => value 表示法更清楚地说明哪些是键/索引以及哪些是值?
  • ... 格式是什么?为什么每一行都以"开头?

标签: php tree


【解决方案1】:

我认为马克的解决方案有点复杂,所以这是我的看法:

(注意:当您到达 URI 的文件名部分时,我将其设置为键和值,不确定那里的预期内容,嵌套示例没有提供很多见解。)

<?php

$urls = array(
    'http://domain.com/a/a.jsp',
    'http://domain.com/a/b/a.jsp',
    'http://domain.com/a/b/b.jsp',
    'http://domain.com/a/b/c.jsp',
    'http://domain.com/a/c/1.jsp',
    'http://domain.com/a/d/2.jsp',
    'http://domain.com/a/d/a/2.jsp'
);

$array = array();

foreach ($urls as $url)
{
    $url = str_replace('http://', '', $url);
    $parts = explode('/', $url);

    krsort($parts);

    $line_array = null;
    $part_count = count($parts);

    foreach ($parts as $key => $value)
    {
        if ($line_array == null)
        {
            $line_array = array($value => $value);
        }
        else
        {
            $temp_array = $line_array;
            $line_array = array($value => $temp_array);
        }
    }

    $array = array_merge_recursive($array, $line_array);
}

print_r($array);

?>

【讨论】:

  • 如果你的 URL 中有一个数字段(如http://example.com/segment1/234/segment3),array_merge_recursive 会给你带来一些麻烦,因为它会将234 转换为整数。请看看那里:stackoverflow.com/a/2215496/1740412 并查看我的评论。
【解决方案2】:
$urlArray = array(  'http://domain.com/a/a.jsp',
                    'http://domain.com/a/b/a.jsp',
                    'http://domain.com/a/b/b.jsp',
                    'http://domain.com/a/b/c.jsp',
                    'http://domain.com/a/c/1.jsp',
                    'http://domain.com/a/d/2.jsp',
                    'http://domain.com/a/d/a/2.jsp'
                 );

function testMapping($tree,$level,$value) {
    foreach($tree['value'] as $k => $val) {
        if (($val == $value) && ($tree['level'][$k] == $level)) {
            return true;
        }
    }
    return false;
}

$tree = array();
$i = 0;
foreach($urlArray as $url) {
    $parsed = parse_url($url);
    if ((!isset($tree['value'])) || (!in_array($parsed['host'],$tree['value']))) {
        $tree['value'][$i] = $parsed['host'];
        $tree['level'][$i++] = 0;
    }
    $path = explode('/',$parsed['path']);
    array_shift($path);
    $level = 1;
    foreach($path as $k => $node) {
        if (!testMapping($tree,$k+1,$node)) {
            $tree['value'][$i] = $node;
            $tree['level'][$i++] = $level;
        }
        $level++;
    }
}


echo '<pre>';
for ($i = 0; $i < count($tree['value']); $i++) {
    echo str_repeat(' ',$tree['level'][$i]*2);
    echo $tree['value'][$i];
    echo '<br />';
}
echo '</pre>';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多