2010-11-24 4 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); 
} 
Смежные вопросы