2010-11-24 19 views
-1

J'ai l'adresse suivante /dir1/dir2/page.phpCréation d'un réseau d'enfant parent basé sur l'URL

Je dois générer un un tableau de parent-> relation enfant forme l'URL ci-dessus.

/dir1 
    | 
    | 
    /dir2/ 
     | 
     | 
     page.php 

par exemple:

array('dir1'=> array(
     'child' => array('dir2' => array(
        'child' => array( 
          'page' => array()))))); 

J'ai essayé d'utiliser la fonction récursive mais pas en mesure de comprendre la logique. S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'explications.

+1

Vous avez l'air d'être nouveau avec SO. Donc, si une réponse vous plaît, veuillez cocher la case à côté de la réponse pour créditer la personne. –

+0

Oui, Matt j'ai récemment rejoint SO.Je vais sûrement le faire. – sagar27

+0

Honnêtement, votre structure de tableau semble complexe en quelque sorte inutile. Y a-t-il autre chose que vous voulez ajouter au tableau? –

Répondre

0

est ici une méthode récursive (désolé pour le manque de commentaires, il est tard):

<?php 
$urls = array('/dir1/dir2/page.php', '/dir1/dir3/page'); 

function url_to_array($url, $array=null) { 
    if($array === null) { 
     $array = array(); 
     $url_parts = explode('/', $url); 

     return url_to_array($url_parts, $array); 
    } else { 
     if(count($url)) { 
      $item = array_pop($url); 
      if($item) { 
       if(!$array) { 
        $array = array('page' => $array); 
       } else { 
        $array = array($item => array('child' => $array)); 
       } 
      } 
      return url_to_array($url, $array); 
     } else { 
      return $array; 
     } 
    } 
} 

$array = array(); 
foreach($urls as $url) { 
    $array = array_merge_recursive($array, url_to_array($url)); 
} 

print_r($array); 
?> 

Il imprime:

wraith:Downloads mwilliamson$ php recursive.php 
Array 
(
    [dir1] => Array 
     (
      [child] => Array 
       (
        [dir2] => Array 
         (
          [child] => Array 
           (
            [page] => Array 
             (
             ) 

           ) 

         ) 

        [dir3] => Array 
         (
          [child] => Array 
           (
            [page] => Array 
             (
             ) 

           ) 

         ) 

       ) 

     ) 

) 
+0

Merci matt la solution a vraiment fonctionné pour moi.Maintenant j'ai encore une chose à demander.J'ai beaucoup d'urls à partir de ce URLs j'ai besoin de générer un arbre de parent et enfant. – sagar27

+0

Par exemple: si j'ai url1:/dir1/dir2/page et url2:/dir1/dir3/page. Donc, ce que je veux, c'est qu'il n'y ait qu'une seule clé pour dir1 et qu'il y ait une sorte de structure arborescente dir2 et dir2. – sagar27

+0

Je viens de mettre à jour le code pour travailler pour plusieurs urls pour vous –

0

Voici un copier/coller depuis un forum, je ne sais pas si cela fonctionne (je l'ai parcouru, et il semble légitime).

function getDirectory($path = '.', $ignore = '') 
{ 
    $dirTree = array(); 
    $dirTreeTemp = array(); 
    $ignore[] = '.'; 
    $ignore[] = '..'; 

    $dh = opendir($path); 

    while (false !== ($file = readdir($dh))) 
    { 
    if (!in_array($file, $ignore)) 
    { 
     if (!is_dir("$path/$file")) 
     { 
     $dirTree["$path"][] = $file; 
     } else { 
     $dirTreeTemp = getDirectory("$path/$file", $ignore); 

     if (is_array($dirTreeTemp)) 
     { 
      $dirTree = array_merge($dirTree, $dirTreeTemp); 
     } 
     } 
    } 
    } 

    closedir($dh); 

    return $dirTree; 
} 
0

Voici une solution réelle que j'ai écrit spécialement pour ce problème. Aucune récursion impliquée!

Ceci renvoie exactement le même tableau que vous avez posté dans votre question.

function recursiveArrayFromURL() { 
    $parts = array_slice(explode("/", $_SERVER['REQUEST_URI']), 1); 
    $refs = array(); 
    foreach($parts as $key => $v) { 
     // remove extension from last file 
     if($key == count($parts) - 1) $v = substr($v, 0, -4); 

     $thisref = &$refs[$v]; 
     if(is_null($thisref)) $thisref = array(); 

     $parent = end(array_slice($parts, 0, $key - 1)); 

     if(!array_key_exists("child", $refs[$parent])) $refs[$parent]['child'] = array(); 
     $refs[$parent]['child'][ $v ] = $thisref; 
    } 
    return array_slice($refs, 0, 1); 
}