基于URL生成父子数组

时间:2010-11-24 05:08:48

标签: php arrays recursion

我有以下网址/dir1/dir2/page.php

我需要从上面的url生成一个parent->子关系数组。

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

例如:

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

我尝试使用递归函数但无法弄清楚逻辑。 如果您需要更多解释,请与我们联系。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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
                                        (
                                        )

                                )

                        )

                )

        )

)

答案 2 :(得分: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);
}