新建文件夹\a\e\
新建文件夹\a\
新建文件夹\b\
新建文件夹\c\
新建文件夹\a\
新建文件夹\a\e\abc.doc
新建文件夹\a\d\a.doc
新建文件夹\c\e\abc.doc
新建文件夹\b\3\以上是目录字符串。
如何生成目录树,格式如下:新建文件夹
+a
++e
+++abc.doc
++d
+++a.doc
+b
++3
+c
++e
+++abc.doc(也就是次级目录比上级目录多一个“+”号)
新建文件夹\a\
新建文件夹\b\
新建文件夹\c\
新建文件夹\a\
新建文件夹\a\e\abc.doc
新建文件夹\a\d\a.doc
新建文件夹\c\e\abc.doc
新建文件夹\b\3\以上是目录字符串。
如何生成目录树,格式如下:新建文件夹
+a
++e
+++abc.doc
++d
+++a.doc
+b
++3
+c
++e
+++abc.doc(也就是次级目录比上级目录多一个“+”号)
$out = `dir e:`;
echo '<pre>'.$out.'</pre>'
?>
列表:新建文件夹\a
列表:新建文件夹\b
列表:新建文件夹\c
列表:新建文件夹\a
列表:新建文件夹\a\e\fdsf.doc
test2simplehtmldom\
simplehtmldom\example\
simplehtmldom\example\scraping\
simplehtmldom\manual\
simplehtmldom\manual\css\
simplehtmldom\manual\img\
simplehtmldom\manual\js\
simplehtmldom\manual\js\jquery-1.2.3.pack.js
simplehtmldom\manual\js\ui.tabs.pack.js
simplehtmldom\manual\manual.htm
simplehtmldom\simple_html_dom.php
test3快递查询接口API\
快递查询接口API\ASP\
快递查询接口API\ASP\example.html
快递查询接口API\ASP\express.asp
快递查询接口API\ASP\快递查询接口集成说明.pdf
快递查询接口API\PHP\
快递查询接口API\PHP\example.html
快递查询接口API\PHP\get.php
快递查询接口API\PHP\snoopy.php
快递查询接口API\PHP\yesnap_config.php
快递查询接口API\PHP\快递查询接口集成说明.pdf
只要能将这几个test转换成指定输出格式的都ok
foreach ($files as $file){
$tempArr=array();
$tempArr=explode('\\',$file);
$tempString='';
$maxElement=count($tempArr);
if(trim($tempArr[$maxElement-1])==''){
$maxElement--;
}else{
}
for($i=0;$i<$maxElement-1;$i++){
$tempString=$tempString.'+';
}
$tempString=$tempString.$tempArr[$maxElement-1];
echo $tempString."<br />";
}
新建文件夹\a\e\
新建文件夹\a\
新建文件夹\b\
新建文件夹\c\
新建文件夹\a\
新建文件夹\a\e\abc.doc
新建文件夹\a\d\a.doc
新建文件夹\c\e\abc.doc
新建文件夹\b\3\
// 增加了复杂度
$str = <<<STR
快递查询接口API\
快递查询接口API\ASP\
快递查询接口API\ASP\example.html
快递查询接口API\ASP\express.asp
快递查询接口API\ASP\快递查询接口集成说明.pdf
快递查询接口API\PHP\
快递查询接口API\PHP\example.html
快递查询接口API\PHP\get.php
快递查询接口API\PHP\snoopy.php
快递查询接口API\PHP\yesnap_config.php
快递查询接口API\PHP\快递查询接口集成说明.pdf
快递查询接口API1\
快递查询接口API1\ASP\快递查询接口API1\ASP\example.html
快递查询接口API2\
快递查询接口API2\ASP\express.asp
快递查询接口API2\ASP\快递查询接口集成说明.pdf
STR;$lines = explode(PHP_EOL, $str);// 使用一个栈记录路径地址
$stack = array();foreach($lines as $line) { $infos = pathinfo($line); if($infos['basename'] == '') continue; if($infos['dirname']) {
$paths = array();
while($infos['dirname'] != '.') {
$paths[] = basename($infos['dirname']);
$infos['dirname'] = dirname($infos['dirname']);
}
$paths[] = $infos['dirname']; //翻转数组就是路径地址
$paths = array_reverse($paths); // 路径不一样
if(array_diff_assoc($stack, $paths)) {
// 跳出当前路径
$stack = $paths;
} else if(array_diff_assoc($paths, $stack)) {
// 进入下一子目录
// 同级目录进行切换
foreach($paths as $key => $path) {
if($stack[$key] != $path) {
$stack[$key] = $path;
}
}
}
} // 如果你要显示出来|-这样的路径,可以是使用$stack来实现,想想怎么解决
// a
// |-a
// | |-b
// | L c
echo str_repeat('+', count($stack)), $infos['basename'], "\n";
}
simplehtmldom\
simplehtmldom\example\
simplehtmldom\example\scraping\
simplehtmldom\manual\
simplehtmldom\manual\css\
simplehtmldom\manual\img\
simplehtmldom\manual\js\
simplehtmldom\manual\js\jquery-1.2.3.pack.js
simplehtmldom\manual\js\ui.tabs.pack.js
simplehtmldom\manual\manual.htm
simplehtmldom\simple_html_dom.php
TEXT;function foo($s) {
return preg_replace('/.+\\\/U', '+', trim($s, "\\\r\n"));
}
$ar = array_map('foo', split("\n", $s));
print_r($ar);Array
(
[0] => simplehtmldom
[1] => +example
[2] => ++scraping
[3] => +manual
[4] => ++css
[5] => ++img
[6] => ++js
[7] => +++jquery-1.2.3.pack.js
[8] => +++ui.tabs.pack.js
[9] => ++manual.htm
[10] => +simple_html_dom.php
)
simplehtmldom\
simplehtmldom\example\
simplehtmldom\example\scraping\
simplehtmldom\manual\
simplehtmldom\manual\css\
simplehtmldom\manual\img\
simplehtmldom\manual\js\
simplehtmldom\manual\js\jquery-1.2.3.pack.js
simplehtmldom\manual\js\ui.tabs.pack.js
simplehtmldom\manual\manual.htm
simplehtmldom\simple_html_dom.php
DIR;$arr=$arr1=preg_split("/\s/",$str);$arr1=array_unique($arr1);
sort($arr1);
function r($n)
{
$n = preg_replace('/\\\$/U', '', $n);
return preg_replace('/.+\\\/U', '+', $n);
}$arr1 = array_map("r", $arr1);var_dump($str,$arr1);
$arr1=array_unique($arr1);//这个是去掉重复的行,如果确认不会有重复可以去掉
sort($arr1);//看到你的字串不是顺序整齐的,所以用这个是把“父”目录排在前面,可以适当根据需要选择不同的数组排序函数
我的代码用了sort啊,也不行么?
你的代码加入一个任意dir 比如
ChartDirector\phpdemo\zoomscrolldemo2.php
好像有点问题 他的父目录不见了。。
b\manual\
c\manual\css\
d\manual\img\
e\manual\js\
f\manual\js\jquery-1.2.3.pack.js
g\manual\js\ui.tabs.pack.js
h\manual\manual.htm
u\simple_html_dom.php
估计要生成一个含有所有节点的树正在研究xpath反向生成xml空节点,老大给点启发,哈哈
1、自动整理
2、按照文件结构输出我觉得还是给一个更加随意的字符串:a\example\scraping\
g\manual\js\ui.js
a\example\scraping\2.txt
b\manual\
a\
a\example
c\manual\css\
d\manual\img\
d\manual\
e\manual\js\
f\manual\js\sdfd.js
f\manual\
b\g\h结果
a
+example
++scraping
+++2.txt
b
+manual
+g
++h
c
+manual
++css
d
+manual
++img
e
+manual
++js
f
+manual
++js
+++sdfd.js这样能够充分说明这2个条件
有个高手说 用二维数组可以比较好处理
a\example\scraping\
g\manual\js\ui.js
a\example\scraping\\2.txt
b\manual\
a\
a\example
c\manual\css\
d\manual\img\
d\manual\
e\manual\js\
f\manual\js\sdfd.js
f\manual\
b\g\h
STR;$lines = array();// 使用一个栈记录路径地址
$stack = array();foreach(explode(PHP_EOL, $str) as $line) {
$lines[] = rtrim($line, '\\').'\\';
}sort($lines);
//var_dump($lines);
$stack = array();
foreach($lines as $path) {
$paths = array_filter(explode('\\', $path), 'trim');
$key = count($stack) - 1;
while($stack && (
// 整个路径不匹配
array_diff_assoc($stack, $paths)
// 路径长度不够
|| (!isset($paths[$key])
// 跳转路径
|| $stack[$key] != $paths[$key])
)) {
array_pop($stack);
$key = count($stack) - 1;
}
$path = array_pop($paths);
$path_len = count($paths);
$stack_len = count($stack);
$d = str_repeat('+', $stack_len);
for($i = $stack_len; $i < $path_len; $i++) {
$stack[$i] = $paths[$i];
echo $d, $paths[$i], "\n";
$d .= '+';
}
$stack[] = $path;
echo $d, $path, "\n";
}输出
a
+example
++scraping
+++2.txt
b
+g
++h
+manual
c
+manual
++css
d
+manual
++img
e
+manual
++js
f
+manual
++js
+++sdfd.js
g
+manual
++js
+++ui.js