<?php
set_time_limit(0);
$string = '0123456789abcdefghijklmnopqrstuvwxyz';
$length = strlen($string);
function makeDir($param)
{
    if(!file_exists($param)) {
        makeDir(dirname($param));
        mkdir($param);
    }

for($i = 0; $i < $length; $i++) {
    for($j = 0; $j < $length; $j++) {
        for($k = 0; $k < $length; $k++) {
            makeDir($string[$i].'/'.$string[$j].'/'.$string[$k]);
        }
    }
}
?>----------------
以上程序为建立各级目录的文件所用。
---------------测试通过的。
function makeDir($param)
{
    if(!file_exists($param)) {
        makeDir(dirname($param));/*这里不明白,这个函数是怎么执行的。在c++ 里面 类的定义的话是构造函数,但是这里不是类的定义。怎么可以出现函数的嵌套执行的?????????????*/        mkdir($param);
    }

这个函数: makeDir(dirname($param));
--------------------------
提问在注析里面了。
--------------------------

解决方案 »

  1.   

    函数递归啊就是调用函数本身就这个函数而言就是从上到下一层层的创建目录以传入1/2/3而言第一次调用时: makedir参数为1/2/3 
    如果存在这个目录就返回了  假设这个目录不存在
     
    就在函数中调用 makedir(第二次调用) 参数为 1/2 因为dirname(1/2/3) = 1/2
    进入makedir后 再次判断 1/2是不是存在 假设不存在 再调用makedir(第三次调用) 判断 目录1是不是存在 假设存在 函数返回此时第三次调用结束 返回第二次调用创建1/2这个目录 函数返回到第一次调用 创建1/2/3目录
      

  2.   

    <?php
    set_time_limit(0);
    //$string = '0123456789abcdefghijklmnopqrstuvwxyz';
    $string = '012';
    $length = strlen($string);
    function makeDir($param)
    {
        if(!file_exists($param)) {
            makeDir(dirname($param));
            echo $param."<br><br><br><br>";
        }

    for($i = 0; $i < $length; $i++) {
        for($j = 0; $j < $length; $j++) {
            for($k = 0; $k < $length; $k++) {
                makeDir($string[$i].'/'.$string[$j].'/'.$string[$k]);
            }
        }
    }
    ?>修改 mkdir($param);为以下 :         echo $param."<br><br><br><br>";
    显示输出的开始一部分为:
    00/00/0/000/00/0/100/00/0/200/10/1/000/10/1/1
      

  3.   

    你把函数内容一层层代进去就明白了 当目录存在时 有判断 if(!file_exists($param)) 存在该目录就直接返回了 不会有输出刚初学理解递归是有点困难 不过仔细想想应该就懂了递归总有一个出口的 不然会陷入死循环溢出 对这里的出口来讲就是 if这个判断语句当目录存在时 该递归结束开始向上回溯
      

  4.   

    我以两层目录为例
    以传入参数 1/2为例function makeDir(1/2)
    {
        if(!file_exists(1/2)) {
            makeDir(dirname(1/2));
           
            mkdir(1/2);
        }
    } 代入makeDir函数后
    function makeDir(1/2)
    {
        if(!file_exists(1/2) {
            function makeDir(1) <--因为dirname(1/2/3) = 1/2
           {
               if(!file_exists(1)) {
                   makeDir(dirname(1));
           
                 mkdir(1);
                }
            }        
            mkdir(1/2);
        }
    } 再代入 makeDir函数变成function makeDir(1/2)
    {
        if(!file_exists(1/2) { <--目录1/2不存在
            function makeDir(1) <--因为dirname(1/2/3) = 1/2
           {
               if(!file_exists(1)) { <--目录1不存在                function makeDir(.) <--因为dirname(1) = .
                   {
                       if(!file_exists(.)) { <--这里是判断根目录是不是存在,结果是根目录存在,所以跳过了if段里面当然语句
                          makeDir(dirname(.)); <--这里和下面两句都没有执行
           
                          mkdir(.);
                       }
                   } <--函数返回了 
           
                 mkdir(1); <--开始创建第一个目录 1
                }
            }        
            mkdir(1/2); <--开始创建第二层目录 1/2
        }

      

  5.   

    <--因为dirname(1/2/3) = 1/2
    应该是dirname(1/2) = 1本来想以三层目录为例 后来想想两层应该也能让你理解了
      

  6.   

    wowh(NETwalker)谢谢这位朋友但是:
    因为dirname(1/2/3) = 1/2
    应该是dirname(1/2) = 1
    -------------------
     1 这个目录仍然不存在,于是继续往下:
    -------------------那么 dirname(1)= .
    ./ 为当前目录那么就执行: makeDir(.)。按照 这种思路我一定是错了的但是我怎么理解好啊
      

  7.   

    是要执行到makeDir(.)的啊 但里面有判断 if(!file_exists(.)) 根目录肯定存在的啊 所以不会再去执行里面的 if语句段里面的 makeDir了啊..你再好好想想吧 都说成这样 再不能理解 我也没办法了
      

  8.   

    也许有一点我应该是理解错了的,你看看小弟说的对不:
    function makedir($param)if 文件不存在就向下执行:0/0/0)
      

  9.   

    也许有一点我应该是理解错了的,你看看小弟说的对不:
    function makedir($param)if 文件不存在就向下执行:把 0/0/0 最后的0和 /去掉,然后:执行mkdir(0/0);这样的话,那么先执行的应该是 0/0。--------------------
    而 mkdir 改为 echo 显示的确是 0 再到 00 再到 000 
    --------------------而且0/0/0应该是一直都不会被执行的,因为总被 dirname 去掉了: /0
    注:按照这个函数:0/0/0 该是第一个传入的参数
      

  10.   

    然后执行的是mkdir(0/0/0);function makeDir($param)
    {
        if(!file_exists($param)) {
            makeDir(dirname($param));  <--这里的dirname($param); 不会改变$param的值 只是把dirname($param); 的值作为另外一个参数 传给 下面一层的makeDir函数  每一层的参数是不互相影响的
            mkdir($param);
        }
    }
      

  11.   

    然后执行的是mkdir(0/0/0);function makeDir($param)
    {
        if(!file_exists($param)) {
            makeDir(dirname($param));  <--这里的dirname($param); 不会改变$param的值 只是把dirname($param); 的值作为另外一个参数 传给 下面一层的makeDir函数  每一层的参数是不互相影响的
            mkdir($param);
        }
    }
      

  12.   

    dirname()   mkdir() 是php自带的函数,相关信息查查手册
      

  13.   

    晕,怎么说这么多余的说话啊
    “dirname() mkdir() 是php自带的函数,相关信息查查手册”
    怎么问非所答的啊,,,不会是大脑烧坏了吧。