无限分类[增强版]

<?php
/**
     +------------------------------------------------
     * 通用的树型类
     +------------------------------------------------
     * @author yangyunzhou@foxmail.com
     +------------------------------------------------
     * @date 0年11月23日10:09:31
     +------------------------------------------------
     */
    class Tree
    {
      
        /**
         +------------------------------------------------
         * 生成树型结构所需要的2维数组
         +------------------------------------------------
         * @author yangyunzhou@foxmail.com
         +------------------------------------------------
         * @var Array
         */
        public $arr = array();
      
        /**
         +------------------------------------------------
         * 生成树型结构所需修饰符号,可以换成图片
         +------------------------------------------------
         * @author yangyunzhou@foxmail.com
         +------------------------------------------------
         * @var Array
         */
        var $icon = array('│','├',' └');
      
        /**
        * @access private
        */
        var $ret = '';
      
        /**
        * 构造函数,初始化类
        * @param array 2维数组,例如:
        * array(
        *      1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
        *      2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
        *      3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
        *      4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
        *      5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
        *      6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
        *      7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
        *      )
        */
        function tree($arr=array())
        {
           $this->arr = $arr;
           $this->ret = '';
           return is_array($arr);
        }
      
        /**
        * 得到父级数组
        * @param int
        * @return array
        */
        function get_parent($myid)
        {
            $newarr = array();
            if(!isset($this->arr[$myid])) return false;
            $pid = $this->arr[$myid]['parentid'];
            $pid = $this->arr[$pid]['parentid'];
            if(is_array($this->arr))
            {
                foreach($this->arr as $id => $a)
                {
                    if($a['parentid'] == $pid) $newarr[$id] = $a;
                }
            }
            return $newarr;
        }
      
        /**
        * 得到子级数组
        * @param int
        * @return array
        */
        function get_child($myid)
        {
            $a = $newarr = array();
            if(is_array($this->arr))
            {
                foreach($this->arr as $id => $a)
                {
                    if($a['parentid'] == $myid) $newarr[$id] = $a;
                }
            }
            return $newarr ? $newarr : false;
        }
      
        /**
        * 得到当前位置数组
        * @param int
        * @return array
        */
        function get_pos($myid,&$newarr)
        {
            $a = array();
            if(!isset($this->arr[$myid])) return false;
            $newarr[] = $this->arr[$myid];
            $pid = $this->arr[$myid]['parentid'];
            if(isset($this->arr[$pid]))
            {
                $this->get_pos($pid,$newarr);
            }
            if(is_array($newarr))
            {
                krsort($newarr);
                foreach($newarr as $v)
                {
                    $a[$v['id']] = $v;
                }
            }
            return $a;
        }
      
        /**
         * -------------------------------------
         *  得到树型结构
         * -------------------------------------
         * @author yangyunzhou@foxmail.com
         * @param $myid 表示获得这个ID下的所有子级
         * @param $str 生成树形结构基本代码, 例如: "<option value=\$id \$select>\$spacer\$name</option>"
         * @param $sid 被选中的ID, 比如在做树形下拉框的时候需要用到
         * @param $adds
         * @param $str_group
         */
        function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '')
        {
            $number=1;
            $child = $this->get_child($myid);
            if(is_array($child)) {
                $total = count($child);
                foreach($child as $id=>$a) {
                    $j=$k='';
                    if($number==$total) {
                        $j .= $this->icon[2];
                    } else {
                        $j .= $this->icon[1];
                        $k = $adds ? $this->icon[0] : '';
                    }
                    $spacer = $adds ? $adds.$j : '';
                    $selected = $id==$sid ? 'selected' : '';
                    @extract($a);
                    $parentid == 0 && $str_group ? @eval("\$nstr = \"$str_group\";") : @eval("\$nstr = \"$str\";");
                    $this->ret .= $nstr;
                    $this->get_tree($id, $str, $sid, $adds.$k.'&nbsp;',$str_group);
                    $number++;
                }
            }
            return $this->ret;
        }
      
        /**
        * 同上一方法类似,但允许多选
        */
        function get_tree_multi($myid, $str, $sid = 0, $adds = '')
        {
            $number=1;
            $child = $this->get_child($myid);
            if(is_array($child))
            {
                $total = count($child);
                foreach($child as $id=>$a)
                {
                    $j=$k='';
                    if($number==$total)
                    {
                        $j .= $this->icon[2];
                    }
                    else
                    {
                        $j .= $this->icon[1];
                        $k = $adds ? $this->icon[0] : '';
                    }
                    $spacer = $adds ? $adds.$j : '';
      
                    $selected = $this->have($sid,$id) ? 'selected' : '';
                    @extract($a);
                    eval("\$nstr = \"$str\";");
                    $this->ret .= $nstr;
                    $this->get_tree_multi($id, $str, $sid, $adds.$k.'&nbsp;');
                    $number++;
                }
            }
            return $this->ret;
        }
      
        function have($list,$item){
            return(strpos(',,'.$list.',',','.$item.','));
        }
      
        /**
         +------------------------------------------------
         * 格式化数组
         +------------------------------------------------
         * @author yangyunzhou@foxmail.com
         +------------------------------------------------
         */
        function getArray($myid=0, $sid=0, $adds='')
        {
            $number=1;
            $child = $this->get_child($myid);
            if(is_array($child)) {
                $total = count($child);
                foreach($child as $id=>$a) {
                    $j=$k='';
                    if($number==$total) {
                        $j .= $this->icon[2];
                    } else {
                        $j .= $this->icon[1];
                        $k = $adds ? $this->icon[0] : '';
                    }
                    $spacer = $adds ? $adds.$j : '';
                    @extract($a);
                    $a['name'] = $spacer.' '.$a['name'];
                    $this->ret[$a['id']] = $a;
                    $fd = $adds.$k.'&nbsp;';
                    $this->getArray($id, $sid, $fd);
                    $number++;
                }
            }
      
            return $this->ret;
        }
    }
    $data= array(
              1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
              2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
              3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
              4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
              5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
              6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
              7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
              );
    $tree = new Tree;           // new 之前请记得包含tree文件!
    $tree->tree($data);         // 数据格式请参考 tree方法上面的注释!
      
    // 如果使用数组, 请使用 getArray方法
    //$tree->getArray(3,2);
      
    // 下拉菜单选项使用 get_tree方法
    //$tree->get_tree(1,'<option value=\$id \$select>\$spacer\$name</option>',3);
    
    $html='<select name="tree">';
     $str = "<option value='\$id' \$select>\$spacer\$name</option>";
    $html .= $tree->get_tree(0,$str,-1).'</select>';
    echo $html;

?>

http://www.oschina.net/code/snippet_99943_2521

//补充


<?php


//一:
mysql_connect('127.0.0.1:3306', 'root', '123456');
$sql = "select * from itcast_shop.it_category where 1 order by sort_order";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)) {
	$list[] = $row;
}
echo '<pre>';
//var_dump($list);


//二,递归查找
/**
 * 
 * @param $arr array 当前所有的可能分类,在该数组内查找子分类
 * @param $p_id int 当前查找的父ID
 *
 * @param $deep int 当前递归调用的深度
 *
 * @return array 排序好的数组列表!
 */
function getTree($arr, $p_id, $deep=0) {
	//利用一个静态局部变量将所有依次找到的元素,都保存
	static $tree = array();
	//遍历所有的可能分类,找到parent_id==$p_id
	foreach($arr as $row) {
		//判断是否为子分类
		if($row['parent_id'] == $p_id) {
			//是子分类
			//记录当前所找到
			$row['deep'] = $deep;
			$tree[] = $row;
			//利用当前查找的分类,找其子分类
			//递归调用
			getTree($arr, $row['cat_id'], $deep+1);
		}
	}

	return $tree;
}

$tree = getTree($list, 0);

//var_dump($tree);

foreach($tree as $row) {
	echo $row['deep'];
	echo str_repeat('  ', $row['deep']);
	echo $row['cat_name'];
	echo '<br>';
}

ztree插件

<?php
require './mysql.class.php';
$db_mysql_config = include './database.php';
$db_mysql =new mysql();
$db_mysql->open($db_mysql_config['default']); 
$sql = "SELECT `userid` as id,`parent_id` as pId,`username` as name FROM `".$db_mysql_config['default']['tablepre']."member`  ";		
$db_mysql->query($sql);
$result_num = 0;
$result = array();
while(($rs = $db_mysql->fetch_next()) != false) {               			
			$result[] = $rs;
}
//print_r($result);
function getTree($arr, $p_id, $deep=0) {  
    //利用一个静态局部变量将所有依次找到的元素,都保存  
    static $tree = array();  
    //遍历所有的可能分类,找到parent_id==$p_id  
    foreach($arr as $row) {  
        //判断是否为子分类  
        if($row['pId'] == $p_id) {  
            //是子分类  
            //记录当前所找到  
            $row['deep'] = $deep;  
            $tree[] = $row;  
            //利用当前查找的分类,找其子分类  
            //递归调用  
		
            getTree($arr, $row['id'], $deep+1);  
        }  
    }  
  
    return $tree;  
}  
  
$tree = getTree($result, 0);  
 
function listTree($arr, $id ,$deep=0) { 
   static $str_arr=array();
    foreach($arr as $row) {  
        //判断是否为子分类  
        if($row['id'] == $id) {  
            //是子分类  
            //记录当前所找到  
            $row['deep'] = $deep;  
            $str_arr[] = $row['name'];  
            //利用当前查找的分类,找其子分类  
            //递归调用  
		
            listTree($arr, $row['pId'], $deep+1);  
        }  
    } 
    return	$str_arr;
} 
$a= listTree($result,1069 );
$a=array_reverse($a);
echo count($a).'级节点:'.implode('>',$a);
/**
  foreach($tree as $row) {  
    echo $row['deep'];  
    echo str_repeat('  ', $row['deep']);  
    echo $row['name'];  
	echo '  id:'.$row['id']; 
    echo '<br>';  
} 
*/  
?>
<!DOCTYPE html>
<HTML>
<HEAD>
	<TITLE>  DEMO </TITLE>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<link rel="stylesheet" href="demo.css" type="text/css">
	<link rel="stylesheet" href="zTreeStyle.css" type="text/css">
	<script type="text/javascript" src="jquery-1.4.4.min.js"></script>
	<script type="text/javascript" src="jquery.ztree.core-3.5.js"></script>
	<!--  <script type="text/javascript" src="../../../js/jquery.ztree.excheck-3.5.js"></script>
	  <script type="text/javascript" src="../../../js/jquery.ztree.exedit-3.5.js"></script>-->
	<SCRIPT type="text/javascript">
		<!--
		var setting = {
			view: {
				showIcon: showIconForTree
			},
			data: {
				simpleData: {
					enable: true
				}
			}
		};

		var zNodes =[
			{ id:1, pId:0, name:"父节点1 - 展开", open:true},
			{ id:11, pId:1, name:"父节点11 - 折叠"},
			{ id:111, pId:11, name:"叶子节点111"},
			{ id:112, pId:11, name:"叶子节点112"},
			{ id:113, pId:11, name:"叶子节点113"},
			{ id:114, pId:11, name:"叶子节点114"},
			{ id:12, pId:1, name:"父节点12 - 折叠"},
			{ id:121, pId:12, name:"叶子节点121"},
			{ id:122, pId:12, name:"叶子节点122"},
			{ id:123, pId:12, name:"叶子节点123"},
			{ id:124, pId:12, name:"叶子节点124"},
			{ id:13, pId:1, name:"父节点13 - 没有子节点", isParent:true},
			{ id:2, pId:0, name:"父节点2 - 折叠"},
			{ id:21, pId:2, name:"父节点21 - 展开", open:true},
			{ id:211, pId:21, name:"叶子节点211"},
			{ id:212, pId:21, name:"叶子节点212"},
			{ id:213, pId:21, name:"叶子节点213"},
			{ id:214, pId:21, name:"叶子节点214"},
			{ id:22, pId:2, name:"父节点22 - 折叠"},
			{ id:221, pId:22, name:"叶子节点221"},
			{ id:222, pId:22, name:"叶子节点222"},
			{ id:223, pId:22, name:"叶子节点223"},
			{ id:224, pId:22, name:"叶子节点224"},
			{ id:23, pId:2, name:"父节点23 - 折叠"},
			{ id:231, pId:23, name:"叶子节点231"},
			{ id:232, pId:23, name:"叶子节点232"},
			{ id:233, pId:23, name:"叶子节点233"},
			{ id:234, pId:23, name:"叶子节点234"},
			{ id:3, pId:0, name:"父节点3 - 没有子节点", isParent:true}
		];
        var zNodes =<?php echo json_encode($result);  ?>;
		function showIconForTree(treeId, treeNode) {
			return !treeNode.isParent;
		};

		$(document).ready(function(){
			$.fn.zTree.init($("#treeDemo"), setting, zNodes);
		});
		//-->
	</SCRIPT>

</HEAD>

<BODY>
<div class="content_wrap">
	<div class="zTreeDemoBackground left">
		<ul id="treeDemo" class="ztree"></ul>
	</div>
	
</div>
</BODY>
</HTML>
		
http://pan.baidu.com/s/1hq23kXm

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值