PHP 无限分类的树类

这几天正好做一个系统碰到一个无限分类,拿来做一个备案。
这个类用递归的方法:
优点:是简单好用。
缺点:是效率低,查询数据库的次数多。
这个类,对于分类(树支)比较少,并且有频繁插入数据到数据库的情况,比较适合。
如果数据比较多,强烈不推荐这种方法。
如果数据多,并且不频繁插入数据的话,用这个方法做一个缓存,可以减少对数据的压力。


<?php
/*
----------------------------------------------------------
ClassName : 树类
Author : shikar
Support : http://www.show-studio.net
----------------------------------------------------------
数据表结构:
CREATE TABLE tree (
id tinyint(3) unsigned default '0',
name varchar(50) default '0',
parentID varchar(50) default '0'
);
数据示例:
INSERT INTO tree VALUES("1", "Food", "");
INSERT INTO tree VALUES("2", "Fruit", "1");
INSERT INTO tree VALUES("3", "Green", "2");
INSERT INTO tree VALUES("4", "Pear", "3");
INSERT INTO tree VALUES("5", "Red", "2");
INSERT INTO tree VALUES("6", "Cherry", "5");
INSERT INTO tree VALUES("7", "Yellow", "1");
INSERT INTO tree VALUES("8", "Banana", "7");
INSERT INTO tree VALUES("9", "Meat", "1");
INSERT INTO tree VALUES("10", "Beef", "9");
INSERT INTO tree VALUES("11", "Pork", "9");
----------------------------------------------------------
*/

class IsTree {
var $mysql_add = "localhost";
var $mysql_user = "root";
var $mysql_pass = "";
var $mysql_db = "test";
var $mysql_table= "tree";
//连接数据库
function IsTree() {
$mysql = @mysql_connect($this->mysql_add,$this->mysql_user,$this->mysql_pass) or die("Can not connect MYSQL!");
@mysql_select_db($this->mysql_db) or die("Can not select database!");
}
//显示整个树的结构
function display_tree($parentID, $level) {
$sql = "SELECT * FROM $this->mysql_table WHERE parentID=".$parentID;
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
echo "|-".str_repeat('-',$level).$row['name']."<br>";
$this->display_tree($row['id'], $level+1);
}
}
//取得一个子节点的路径,返回一个数组,内容是id
function get_path_id($id) {
$result = mysql_query("SELECT parentID FROM $this->mysql_table WHERE mso-spacerun: yes"> $row = mysql_fetch_array($result);
$path = array();
if ($row['parentID']!='') {
$path[] = $row['parentID'];
$path = array_merge($this->get_path_id($row['parentID']), $path);
}
return $path;
}
//取得一个子节点的路径,返回一个数组,内容是name
function get_path_name($id) {
$path_id = $this->get_path_id($id);
foreach($path_id as $key=>$val) {
$row = mysql_fetch_array(mysql_query("SELECT name FROM $this->mysql_table WHERE id=$val"));
$path[] = $row['name'];
}
Return $path;
}
}
//EXAMPLES:
$tree = new IsTree();
$tree->display_tree(1, 0);
print_r($tree->get_path_id(8));
echo "<br>";
print_r($tree->get_path_name(8));
?>

Tags:

Leave a comment