无限级分类

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


/***
====笔记部分====
***/

/*
$area = array(
array('id'=>1,'name'=>'安徽','parent'=>0),
array('id'=>2,'name'=>'海淀','parent'=>7),
array('id'=>3,'name'=>'濉溪县','parent'=>5),
array('id'=>4,'name'=>'昌平','parent'=>7),
array('id'=>5,'name'=>'淮北','parent'=>1),
array('id'=>6,'name'=>'朝阳','parent'=>7),
array('id'=>7,'name'=>'北京','parent'=>0),
array('id'=>8,'name'=>'上地','parent'=>2)
);
*/

 

 


//echo mkdir('./a')?'ok':'fail';

// 失败,没有b目录,导致c目录创建失败
// echo mkdir('./b/c')?'ok':'fail';


/*
递归创建目录
要求:自己写函数
完成一次创建 ./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/b/c/d/e/f')?'OK':'fail';
*/


/*
function mk_dir($path) {
// 如果目录已经存在,直接返回
if(is_dir($path)) {
return true;
}


// 如果目录不存在,创建.
// 问题:父目录就一定存在吗?
// 答:不一定.
// 因此我要求你保证:
// 父目录存在 ,或者你帮我创建了父目录

return is_dir(dirname($path))||mk_dir(dirname($path))?mkdir($path):false;
}


echo mk_dir('./aa/bb/cc')?'ok':'fail';
*/


/**
上面的两种递归创建级联目录,是为了练习递归
在开发中,没必要如此,
PHP5的mkdir函数,自身就能够创建级联目录
**/

//echo mkdir('./aaa/bbb/ccc',0777,true)?'OK':'fail';

echo mkdir('./a/b/c/d/e/f',0777,true)?'OK':'fail';

 

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


/***
====笔记部分====
递归删除目录
***/

 

function deldir($path) {

// 不是目录,直接返回
if(!is_dir($path)) {
return NULL;
}

$dh = opendir($path);
while(($row = readdir($dh)) !== false) {
if($row == '.' || $row == '..') {
continue;
}
// 判断是否是普通文件
if(!is_dir($path . '/' . $row)) {
unlink($path . '/' . $row);
} else {
deldir($path . '/' . $row); //递归把子目录/子文件删了.
}
}

closedir($dh);
rmdir($path);

echo '删了',$path,'<br />';
return true;

}

echo deldir('./a')?'OK':'fail';

 

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


/***
====笔记部分====
递归与迭代的区别与联系

递归自身调用自身,每一次调用把问题简化,直到问题解决.

sum(10) 不会算,难.
10 + sum(9)->不会算,难
9 + sum(8)-->
....
.....
2+ sum(1)
返回1,简单

即:把大的任务拆成相同性质的多个小任务.
以昨天的 猴子摘桃为例
| | | | |
变成5只猴子来,每只狮子只接1颗桃

即: 人多,每人完成一件.


思考: 如果是只普通猴子,变不出第2只猴子来,只能自己摘
应该: 走走走,走到最右边,从右到左,一个个摘回来
这次 1只猴子把要作的工作列出,每次做一步.
1只猴子做多步工作.

迭代:就是指在某个范围内,反复执行相同工作.

 

递归: 5只猴子,每只猴子,摘1颗桃,完成1步工作
迭代: 1只猴子,这只儿子,摘5颗桃,完成5步工作

 

***/

function recsum($n) {
if($n > 1) {
return $n + recsum($n-1);
} else {
return 1;
}

}


/*
这是一个典型的递归调用,
在计算出结果前,最多的时候,共有10个函数同时运行.
*/
echo recsum(10),'<br />';


function itsum($n) {
for($sum=0,$i=1;$i<n;$i++) {
$sum += $i;
}

return $sum;
}

 

 

 

<?php
/****
燕十八 公益PHP讲堂

论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/


/***
====笔记部分====
理论上:(借助栈)递归都是可以转化为迭代的!
***/

 

/*
迭代来创建级联目录
./a/b/c/d

思路:要把从浅到深创建目录的步骤,列成单子.
然后1只小猴,一层层的去创建
*/

function mk_dir($path) {
$arr = array();

while(!is_dir($path)) {
// 例 /a/b/c/d 如果不目录,则是我的工作
array_push($arr,$path); //工作计划入栈
$path = dirname($path);
}

//print_r($arr);

if(empty($arr)) {
return true;
}

// 工作计划出栈
while(count($arr)) {
echo $tmp = array_pop($arr),'出栈<br />';
mkdir($tmp);
}

return true;
}


mk_dir('./a/b/c/d/e');

 

posted on 2012-11-26 17:22  besile  阅读(341)  评论(0)    收藏  举报