2010-11-24 116 views
-1

父子陣列我有以下URL /dir1/dir2/page.php生成基於URL

我需要生成父 - 的陣列>子的關係形成上述URL。

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

如:

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

我使用遞歸功能,但無法找出邏輯嘗試。 如果您需要更多解釋,請讓我知道。

+1

你看起來像你是新來的SO。所以如果答案令你滿意,請檢查答案旁邊的複選框,以給予該人信用。 – 2010-11-24 05:49:08

+0

是的,馬特我最近加入了SO.I將會這麼做。 – sagar27 2010-11-24 06:15:50

回答

0

這裏是一個遞歸方法(對不起,缺乏意見,它的晚):

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

它打印出:

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

           ) 

         ) 

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

           ) 

         ) 

       ) 

     ) 

) 
0

這裏是從論壇複製/粘貼,所以我不知道它的工作原理(我剔除它,它看起來合法)。

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

這裏是我的專門寫一個實際的解決方案這個問題。沒有涉及遞歸!

這將返回與您在問題中發佈的完全相同的數組。

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