漂定

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
<?php
class MyCate{
    /**
     * 组合成一维数组
     * @param $cateArr 数组
     * @param string $html
     * @param int $pid 上级ID
     * @param int $level 等级
     * @return array
     */
    static function unLimitedForLevel($cateArr,$html=' -- ',$pid=0,$level=0){
        $arr = array();
        foreach($cateArr as $v){
            if($v['pid']==$pid){
                $v['level'] = $level+1;
                $v['html'] = str_repeat($html,$level);
                $arr[] = $v;
                $arr = array_merge($arr,self::unLimitedForLevel($cateArr,$html,$v['id'],$level+1));
            }
        }
        return $arr;
    }

    /**
     * 无限级分类,组合成多级数组
     * @param $cateArr 分类数组
     * @param int $pid 上级ID
     * @return array
     */
    static function unLimitForLayer($cateArr,$pid=0){
        $arr = array();
        foreach($cateArr as $v){
            if($v['pid']==$pid){
                $v['child'] = self::unLimitForLayer($cateArr,$v['id']);
                $arr[] = $v;
            }
        }
        return $arr;
    }

    /**
     * 给自ID,得到所属父级ID数据
     * @param $cateArr 数组
     * @param $id 自身ID,递归中传PID
     * @return array
     */
    static function getParents($cateArr,$id){
        $arr = array();
        foreach($cateArr as $v){
            if($v['id']==$id){
                $arr[] = $v;
                #$arr = array_merge($arr,self::getParents($cateArr,$v['pid']));
                $arr = array_merge(self::getParents($cateArr,$v['pid']),$arr);
            }
        }
        return $arr;
    }

    /**
     * 传递一个父级分类ID返回所有子分类ID
     */
    static function getChildsId($cateArr,$pid){
        $arr = array();
        foreach($cateArr as $v){
            if($v['pid']==$pid){
                $arr[] = $v['id'];
                $arr = array_merge($arr,self::getChildsId($cateArr,$v['id']));
            }
        }
        return $arr;
    }


}

 

# 递归和迭代的应用

<?php
header('Content-Type:text/html;charset=UTF-8');
/**
 * 递归打印级联目录
 */
function recDir($path,$level=1){
    $dh = opendir($path);
    while (false !== ($dir = readdir($dh))) {
        if($dir=='.' || $dir=='..') continue;
        echo str_repeat('&nbsp;&nbsp;', $level).$dir.'<hr>';
        if(is_dir($path.'/'.$dir)){
            recDir($path.'/'.$dir,$level+1);
        }
    }

    closedir($dh);
}
#recDir('./pmd/');



// 递归创建目录
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);
}
#var_dump(mk_dir('./a/b/c/d/f/g/i'));

// 递归创建目录方法2
function mk_dir2($path){
    # 如果目录存在,直接返回
    if(is_dir($path)) return true;
    #如果目录不存在,创建
    return is_dir(dirname($path)) || mk_dir2(dirname($path))? mkdir($path) : false;
}
#var_dump(mk_dir2('./aa/b/c/d/f/g/i'));

// 迭代创建级联目录
function mk_dir3($path){
    $arr = array();
    while(!is_dir($path)){
        array_unshift($arr, $path);
        $path = dirname($path);
    }
    if(count($arr)<=0) return true;

    foreach($arr as $v){
        mkdir($v);
    }
    return true;
}

mk_dir3('./aa/b/c/d/f/g/i');

// 递归删除目录
function delDir($path){
    # 不是目录直接返回
    if(!is_dir($path)) return false;

    $dh = opendir($path);
    while(false !== ($row=readdir($dh))){
        if($row=='.' || $row=='..') continue;

        # 是否是普通文件
        if(!is_dir($path.'/'.$row)){
            unlink($path.'/'.$row);
        }else{
            delDir($path.'/'.$row);
        }
    }
    closedir($dh);
    rmdir($path);
    return true;
}


$area = array(
    array('id'=>1,'name'=>'北京','parent'=>0),
    array('id'=>2,'name'=>'海淀','parent'=>1),
    array('id'=>3,'name'=>'香山','parent'=>2),
    array('id'=>4,'name'=>'上地','parent'=>2),
    array('id'=>5,'name'=>'朝阳','parent'=>1),
    array('id'=>6,'name'=>'昌平','parent'=>1),
    array('id'=>7,'name'=>'顺义','parent'=>1),
    array('id'=>8,'name'=>'安徽','parent'=>0),
    array('id'=>9,'name'=>'芜湖','parent'=>8)
);

// 找子栏目
function subTree($arr,$parentID=0,$level=1){
    static $sonArr = array();
    foreach($arr as $v){
        if($parentID == $v['parent']){
            $v['level'] = $level;
            $sonArr[] = $v;
            subTree($arr,$v['id'],$level+1);
        }
    }
    return $sonArr;
}

function subTree2($arr,$parentID=0,$level=1){
    $sonArr = array();
    foreach($arr as $v){
        if($parentID == $v['parent']){
            $v['sub'] = subTree2($arr,$v['id'],$level+1);
            $sonArr[] = $v;
            
        }
    }
    return $sonArr;
}

/*
$a = subTree2($area,0);
echo '<pre>';
print_r($a);
*/

function parentTree($area,$id){
    static $tree = array();
    foreach($area as $v){
        if($v['id']==$id){
            $tree[] = $v;
            if($v['parent']>0){
                parentTree($area,$v['parent']);
            }
        }
    }
    return $tree;
}

function parentTree2($area,$id){
    $tree = array();
    foreach($area as $v){
        if($v['id']==$id){
            $tree[] = $v;
            if($v['parent']>0){
                $tree = array_merge(parentTree2($area,$v['parent']),$tree);
                #$tree = array_merge($tree,parentTree2($area,$v['parent']));
            }
        }
    }
    return $tree;
}
/*
$a = parentTree2($area,3);
echo '<pre>';
print_r($a);
*/

// 迭代Tree操作
function iterationTree($arr,$id){
    $tree = array();
    while($id!==0){
        foreach($arr as $v){
            if($v['id'] == $id){
                $tree[] = $v;
                $id = $v['parent'];
                break;
            }
        }
    }

    return $tree;
}
/*
$a = iterationTree($area,3);
echo '<pre>';
print_r($a);
*/

// 用迭代法找子孙树
function iterationSubTree($arr,$parent=0){
    $task = array($parent); # 任务表
    $tree = array(); # 地区表
    while (count($task)>0) {
        $flag = false;
        foreach($arr as $k=>$v){
            if($v['parent']==$parent){
                $tree[] = $v;
                # 最新的地区ID入任务栈
                array_push($task, $v['id']);
                $parent = $v['id'];
                unset($arr[$k]);
                $flag = true; # 说明找到了子栏目
                break;
            }
        }
        if($flag == false){
            array_pop($task);
            $parent = end($task);
        }
    }
    return $tree;
}

$a = iterationSubTree($area,0);
echo '<pre>';
print_r($a);
?>

 

posted on 2013-08-21 09:30  漂定  阅读(373)  评论(0编辑  收藏  举报