ahwu
<?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);
?>

 

分类:

技术点:

相关文章:

  • 2021-09-11
  • 2021-09-29
  • 2022-12-23
  • 2021-06-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-10-21
  • 2021-12-27
  • 2021-07-20
  • 2021-09-27
  • 2021-07-15
相关资源
相似解决方案