新建文件夹\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(也就是次级目录比上级目录多一个“+”号)

解决方案 »

  1.   

    这是要通过什么方式实现呢,写shell脚本吗?
      

  2.   

    <?php
     $out = `dir e:`;
     echo '<pre>'.$out.'</pre>'
    ?>
      

  3.   

    .........................给几个测试的字符串:test1列表:新建文件夹\a\e
    列表:新建文件夹\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
      

  4.   

    $files=file('dir.php');
    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 />";
    }
      

  5.   

    'dir.php'里就是
    新建文件夹\a\e\
    新建文件夹\a\
    新建文件夹\b\
    新建文件夹\c\
    新建文件夹\a\
    新建文件夹\a\e\abc.doc
    新建文件夹\a\d\a.doc
    新建文件夹\c\e\abc.doc
    新建文件夹\b\3\
      

  6.   

    没记错的话 网上有很多很多函数可以直接copy.
      

  7.   

    <?php
    // 增加了复杂度
    $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";
    }
      

  8.   

    $s = <<< TEXT
    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
    )
      

  9.   

    $str= <<< 'DIR'
    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);
      

  10.   

    补充一下
    $arr1=array_unique($arr1);//这个是去掉重复的行,如果确认不会有重复可以去掉
    sort($arr1);//看到你的字串不是顺序整齐的,所以用这个是把“父”目录排在前面,可以适当根据需要选择不同的数组排序函数
      

  11.   


    我的代码用了sort啊,也不行么?
      

  12.   


    你的代码加入一个任意dir 比如
    ChartDirector\phpdemo\zoomscrolldemo2.php
    好像有点问题 他的父目录不见了。。
      

  13.   

    这样啊……就是说你的字串其实不是完整dir列表这就麻烦了
      

  14.   

    上面都存在一个问题,那就是类似这样的 不能够正确输出a\example\scraping\
    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
      

  15.   

    因为你之前发的字串都是很规则的,也没说明有混杂情况不急的话等等吧,看看这两天有没有时间……最近也打算研究类似的问题,不过是xml的说不准呆会就有人来搞定,也帮我开开窍,嘿嘿
      

  16.   


    估计要生成一个含有所有节点的树正在研究xpath反向生成xml空节点,老大给点启发,哈哈
      

  17.   

    还是按照要求输出指定结构的字符串
    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个条件
    有个高手说 用二维数组可以比较好处理
      

  18.   

    <?php$str = <<<STR
    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