• 递归与迭代学习(联级目录的创建与删除)


    一般来说,递归和迭代是可以互相转换的。
    迭代是有点类似栈的概念,后进先出,
    可以使用 array_pop 和array_push函数来用数组来实现栈的概念。
    下面看两个程序,及实现图就懂了: 
    /***************************************************************************************************
                        递归法创建和删除联级目录
    ****************************************************************************************************/ 
    <?php
     
    //递归创建目录,完成一次性 ./a/b/c/d/e目录
    //方法一
    function mk_dir($path){
    //运气非常好,这个目录存在,这样返回TRUE就可以了
    if(is_dir($path)){
    return true;
    }
    //运气一般,目录的父目录存在
    if(is_dir(dirname($path))){
    return mkdir($path);
    }
    //运气较差,父目录也不存在,创建父目录
    mk_dir(dirname($path));
    return mkdir($path);
    }
    echo mk_dir('./a/ba/c/d/e/f')?'OK':"false";
     
     
    //方法二:
    function mk_dir2($path){
    //如果目录已经存在,直接返回
    if(is_dir($path))
    return true;
    //如果父目录不存在则创建  父目录存在或者创建一个父目录
    return is_dir(dirname($path))||mk_dir2(dirname($path))?mkdir($path):false;
    }
    echo mk_dir2('./a/b/c/d/e/f')?'OK':"false";
     
    //方法三  使用php5.0以后的自带的函数
    echo mkdir('./a/bss/c/d/e/f',077,true)?'OK':"false";
     
     
    //递归删除目录
    function deldir($path){
    if(!is_dir($path)){
    return NULL;
    }
     
    $dh = opendir($path);
    while(($row = readdir($dh))!== false){
    if($row == '.' || $row == '..'){
    continue;
    }
    //echo "<br/>",$path.'/'.$row." delete successful";
    //判读是否是普通文件
    if(!is_dir($path.'/'.$row)){
    unlink($path.'/'.$row);
    }else{
    deldir($path.'/'.$row);
    }
    }
    closedir($dh);
    rmdir($path);
    echo "<br/>",$path." delete successful";
    return true;
    }
     
    echo deldir('./a')?"<br/>删除成功":"<br/>删除失败";
     
    ?>
    结果图:
     图片
     
    /***************************************************************************************************
                        迭代法创建和删除联级目录
    ****************************************************************************************************/ 
    <?php
     
    //迭代创建目录
    //./a/b/c/d/e/f/g
     
    function mk_dir($path){
    $arr = array();
    while(!is_dir($path)){
    //如果还不是目录则是我的工作
    ////往数组最后一个单元压入要创建的目录
    //array_push($arr,$path);
    //往数组开头一个单元压入要创建的目录
    array_unshift($arr,$path);
    //获取父目录
    $path = dirname($path);
    }
    //print_r($arr);
     
    if(empty($arr)){
    echo "<br/>the directory is exists!";
    return true;
    }
     
    foreach($arr as $v){
    echo "<br/>Create new directoty successful for $v";
    mkdir($v);
    }
    while(($path_dir = array_pop($arr))!== null){
    echo "<br/>delete directoty successful for $path_dir";
    rmdir($path_dir);
     
    }
     
    return true;
    }
     
    mk_dir("./a/b/c/d/e/f/g/h");
     
    ?>
     
    图片
     
     
  • 相关阅读:
    VSCode 快捷键(整理)
    MySQL数据库插入 100w 条数据用了多久?
    @Transactional事务几点注意及其属性Propagation的使用
    maven deploy时报错 distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter
    Spring Boot+Mybatis 配置多数据源
    IDEA集成MyBatis Generator 插件 详解
    Spring boot中Yml文件的坑
    朝北教室的风筝 初听不知曲中意,再听已是曲中人
    Debug 调试问题-如何找到出问题的方法
    资损问题
  • 原文地址:https://www.cnblogs.com/lihaiyan/p/4274447.html
Copyright © 2020-2023  润新知