我有以下网址/dir1/dir2/page.php
我需要从上面的url生成一个parent->子关系数组。
/dir1
|
|
/dir2/
|
|
page.php
例如:
array('dir1'=> array(
'child' => array( 'dir2' => array(
'child' => array(
'page' => array())))));
我尝试使用递归函数但无法弄清楚逻辑。 如果您需要更多解释,请与我们联系。
答案 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);
}