2010-06-22 4 views
4

Je dois construire un arbre (avec des tableaux) à partir d'URLs donnés.Construire Array Array à partir d'URLs

je la liste suivante des urls:

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 

maintenant je besoin d'un tableau comme celui-ci:

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

Comment puis-je faire avec php?

+2

Pourriez-vous plus clairement qui sont les clés/index et qui sont des valeurs à l'aide de la clé 'PHP-standardish => value' notation? –

+0

... et avec le formatage? Pourquoi chaque ligne commence par '" '? –

Répondre

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

je pensais était un peu la solution de marque compliquée donc voici mon avis sur la question:

(Note: quand vous arrivez à la partie du nom de fichier de l'URI, je le définir comme la clé et la valeur, ne savait pas ce qui était attendu là, l'échantillon imbriqué n'a pas donné un aperçu beaucoup.)

<?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

Si vous avez un segment numérique dans une URL (comme' http: // exemple.com/segment1/234/segment3'), 'array_merge_recursive' vous causera des problèmes car il jette '234' sous la forme d'un entier.Veuillez y jeter un coup d'oeil: http://stackoverflow.com/a/2215496/1740412 et regardez mon commentaire. – Link14