2010-06-22 67 views
4

我需要从给定的URL构建一个树(包含数组)。从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?

+2

你能说得清楚哪些是关键/索引和它使用的是PHP-standardish'键值=>值'符号? – 2010-06-22 14:56:07

+0

...和格式化是什么?为什么每行都以'''开头? – 2010-06-22 14:57:23

回答

0
$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>'; 
2

我认为马克的解决方案是一个有点复杂,所以这里是我对此采取:

注:当你到了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); 

?> 
+0

如果你有一个数值段(比如'http:// example.com/segment1/234/segment3'),'array_merge_recursive'会给你带来一些麻烦,因为它会把'234'作为一个整数。请看看那里:http://stackoverflow.com/a/2215496/1740412看看我的评论。 – Link14 2015-01-02 23:31:31