2010-11-24 5 views
-1

Ich habe die folgende URL /dir1/dir2/page.phpGenerieren eines Eltern-Kind-Array basierend auf URL

ich eine Reihe der Eltern-> Kind-Beziehung bilden die oben genannte URL generieren müssen.

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

zB:

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

ich die rekursive Funktion versucht, mit, aber nicht in der Lage, die Logik zu verstehen. Bitte lassen Sie mich wissen, wenn Sie mehr Erklärung benötigen.

+1

Sie sehen aus, als ob Sie neu in SO sind. Wenn Ihnen also eine Antwort gefällt, aktivieren Sie bitte das Kontrollkästchen neben der Antwort, um der Person eine Gutschrift zu geben. –

+0

Ja, Matt, ich bin kürzlich zu SO gegangen. Ich werde das tun. – sagar27

+0

Ehrlich gesagt sieht Ihre Array-Struktur irgendwie unnötig komplex aus. Möchten Sie dem Array noch etwas hinzufügen? –

Antwort

0

Hier ist eine rekursive Methode (sorry mangels Kommentare, es ist spät):

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

Es druckt:

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

           ) 

         ) 

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

           ) 

         ) 

       ) 

     ) 

) 
+0

Dank matt die Lösung hat wirklich funktioniert für mich.Nun habe ich noch eine Sache zu fragen.Ich habe viele URLs thn von diesen URLs ich brauche einen Baum von Eltern und Kind zu generieren. – sagar27

+0

zB: wenn ich url1:/dir1/dir2/seite und url2:/dir1/dir3/seite habe. also was ich will ist, dass es nur einen Schlüssel für dir1 und darunter sollte es sein sollte dir2 und dir2 Art von Baumstruktur. – sagar27

+0

Ich habe gerade den Code aktualisiert, um für mehrere URLs für Sie zu arbeiten –

0

Hier ist ein Kopieren/Einfügen von einem Forum, so dass ich nicht weiß, dass es funktioniert (ich überflog es, und es sieht echt aus).

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

Hier ist eine tatsächliche Lösung, die ich für speziell geschrieben dieses Problem. Keine Rekursion beteiligt!

Dies gibt genau das Array zurück, das Sie in Ihrer Frage angegeben haben.

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); 
} 
Verwandte Themen