2010-11-24 14 views
-1

に基づいて、親の子配列を生成する私は、上記のURLを形成parent->親子関係の配列を生成する必要があります。は私が</p> <p>/dir1/dir2/page.php次のURLを持つURL

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

例:

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

私は、再帰関数を使用してみましたが、ロジックを把握することはできません。 さらに詳しい説明が必要な場合はお知らせください。

+1

あなたはまったく新しいようです。だから答えがあなたを喜ばせるなら、答えの横にあるチェックボックスをチェックして、その人にクレジットを与えてください。 –

+0

はい、最近MattさんがSOに参加しました。 – sagar27

+0

あなたの配列構造は何とか不必要に複雑に見えます。配列に追加したいことはありますか? –

答えて

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

解決策が本当に私のために働いてくれてありがとうございました。私はもう1つ質問します。私は親と子のツリーを生成する必要があるURLから多くのURLを持っています。 – sagar27

+0

例:url1:/ dir1/dir2/pageとurl2:/ dir1/dir3/pageがある場合。だから、私が望むのは、dir1のキーが1つだけでなければならず、その下にdir2とdir2の木構造がなければならないということです。 – sagar27

+0

私はちょうどあなたのために複数のURLのために働くコードを更新しました –

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); 
} 
関連する問題