PHP小程式-递归

这有几个关于递归的PHP小题目,稍微做了一下,还挺有意思的。

1.将一个多维数组的每项是数字的值修改为原来的两倍。
一般用途:对POST、GET获得的数据做递归安全转义。

<?php
$arr = array(1,2,3,'a',5,array(6,'b',array(7,'h',array(8,9,'s'))));
function to_double($arr){
    foreach ($arr as $key => $value) {
        if(is_numeric($value)){
            $arr[$key] = $value * 2;
        }
        if(is_array($value)){
            $arr[$key] = to_double($value);
        }
    }
    //print_r($arr);
    return $arr;
}
$ma = $arr;
print_r(to_double($ma));
/*
result:
array(2,4,6,'a',10,array(12,'b',array(14,'h',array(16,18,'s'))));
*/
?>

2.递归创建级联目录,如给定./a/b/c/d/e,可创建一系列目录。
一般用途:创建日期目录“年/月/日”,存放上传文件。

function create_dir($path){
    if(is_dir($path)){
        return true;
    }
    if(@!mkdir($path)){    //这里我不管父目录存不存在,直接去创建
                        //创建失败的话,再试着去创建父目录
        //echo $path.'<br>';
        create_dir(dirname($path));    
        mkdir($path);    //这个语句在这里,意味着上一个语句执行完毕才执行,
                        //也就是递归调用创建父目录完成了
    }
}
create_dir('./a/b/c/d/e/d/a/c/v/v/b/n/f/d');

还有个更符合常理的方法,也更简洁,是先判断父目录是否存在或者可以创建,再去创建此目录。

function create_dir_2($path){
    if(is_dir($path)){
        return true;  
    }
    return create_dir_2(dirname($path)) ? mkdir($path) : false;
}
//或者:用一行搞定
function create_dir_3($path){
    return is_dir($path) ? true : (create_dir_3(dirname($path)) ? mkdir($path) : false);   
}

3.删除目录以及目录下所有文件。
郑重提醒:慎用删除。

<?php
function del_dir($path){
    if(!is_dir($path) && @!unlink($path)){
        echo 'The file does not exist';
        return false;
    }
    if(($path === '.') || ($path === '..')){
        echo 'Do not delete current or parent directory please';
        return false;
    }    //手贱故意不做这判断试试能不能删当前
        //结果就悲剧了,还好有工具能恢复。
    echo $path;
    $opd = opendir($path);
    while (false !== ($file = readdir($opd))) {
        if(($file !== '.') && ($file !== '..')){
            del_dir($path.'/'.$file);
        }
    }
    closedir($opd);
    rmdir($path);

}
del_dir('./a');
?>

4.无限级分类

<?php
echo '<br>';
$arr = array(
    array('id'=>1,'area'=>'北京','pid'=>0),
    array('id'=>2,'area'=>'浙江','pid'=>0),
    array('id'=>3,'area'=>'海淀','pid'=>1),
    array('id'=>4,'area'=>'河北','pid'=>0),
    array('id'=>5,'area'=>'杭州','pid'=>2),
    array('id'=>6,'area'=>'温州','pid'=>2),
    array('id'=>7,'area'=>'平阳','pid'=>6),
    array('id'=>8,'area'=>'下沙','pid'=>5)
    );
/***
北京
----海淀
浙江
----杭州
--------下沙
----温州
--------平阳
河北
***/
function cat($arr,$num,$t){
    for($i=0;$i<count($arr);$i++){
        if($arr[$i]['pid'] === $num){
            $m = $t;
            while($m--){
                echo '----';
            }
            echo $arr[$i]['area'].'<br>';
            cat($arr,$arr[$i]['id'],$t+1);
        }
    }
}
cat($arr,0,0);
?>

递归这玩意,博大精深,玩起来挺有意思,就是稍微有点绕。