PHP
·
发表于 5年以前
·
阅读量:8303
±¾ÎÄʵÀý½²ÊoÁËPHP´ø½Úµa²Ù×÷µÄÎÞÏÞÖÀaʵÏÖ½¨¡£ÖÏi¸ø´o¼Ò¹(C)´o¼Ò²Î¿¼£¬¾ßÌaÈçÏ£º
°uº¬£¨Òƶ¯¶a¸o½Úµa£»Òƶ¯µ¥¸o½Úµa£»É¾³ý¶a¸o½Úµa£»É¾³ýµ¥¸o½Úµa£»ÐÂÔo½Úµa£(C)£¬Ái¸½Êý¾Ý¿a±i½a¹¹
Ò»¡¢db sqlÓi¾a
//db used for phpÎÞÏÞ*ÖÀa
create table tree(
id int(10) not null primary key auto_increment,
name varchar(255) not null,
lft int(10) not null default 0,
rgt int(10) not null default 0,
status int(1) not null default 0,
index lft (`lft`),
index rgt (`rgt`),
index status(`status`)
)charset utf8;
insert into tree value (null,'Food',1,18,0);
insert into tree value (null,'Fruit',2,11,0);
insert into tree value (null,'Red',3,6,0);
insert into tree value (null,'Cherry',4,5,0);
insert into tree value (null,'Yellow',7,10,0);
insert into tree value (null,'Banana',8,9,0);
insert into tree value (null,'Meat',12,17,0);
insert into tree value (null,'Beef',13,14,0);
insert into tree value (null,'Pork',15,16,0);
¶þ¡¢phpÎļþ
<?php
error_reporting(0);
/*
1 Food 18
+------------------------------+
2 Fruit 11 12 Meat 17
+-------------+ +------------+
3 Red 6 7 Yellow 10 13 Beef 14 15 Pork 16
4 Cherry 5 8 Banana 9
descendants = (right ¨C left - 1) / 2
*/
/**
*ÓÃÓÚÒƶ¯Ò»¸o½Úµa£¨°uÀ¨×Ó½Úµa£(C)
*@param array $pdata = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò» ¸¸½Úµa(Ϊ¿Õʱ²aÈe×i´oµÄ¸¸½Úµa)
*@param array $ndata = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò» ÏÂÒ»¸oÐֵܽڵa£¨Ã»ÓÐÐֵܵÄʱºo¾Í²»Óã(C)
*@param array $cdata = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò» µ±Ç°´ýÒƶ¯µÄ½Úµa
*/
function move_tree_all($pdata=array(),$ndata=array(),$cdata=array()) {
$cid = $cdata['id'] ? intval($cdata['id']) : '';
$croot = $cdata['root'];
if(!$cid && !$croot) return;
//Ðe×Ô¼ÓÅжÏ
//1¡¢cdata²»ÄÜΪ¶¥¼¶
//2¡¢cdata²»ÄܱÈ$pdataµÈ¼¶¸ß
$adata = get_tree_all($cdata); //»ñÈ¡µ±Ç°Òƶ¯½ÚµaµÄËuÓнڵa
delete_tree_all($cdata,1); //Â߼ɾ³ýµ±Ç°Òƶ¯½ÚµaµÄËuÓнڵa
foreach($adata as $k => $val) {
if($k != 0) {
$pdata = array('root'=>$val['parent']);
insert_tree($pdata,'',$val['name'],1);
} else { //first
insert_tree($pdata,$ndata,$val['name'],1);
}
}
}
/**
*ÓÃÓÚÒƶ¯Ò»¸o½Úµa£¨²»°uÀ¨×Ó½Úµa£(C)
*@param array $pdata = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò» ¸¸½Úµa(Ϊ¿Õʱ²aÈe×i´oµÄ¸¸½Úµa)
*@param array $ndata = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò» ÏÂÒ»¸oÐֵܽڵa£¨Ã»ÓÐÐֵܵÄʱºo¾Í²»Óã(C)
*@param array $cdata = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò» µ±Ç°´ýÒƶ¯µÄ½Úµa
*/
function move_tree_item($pdata=array(),$ndata=array(),$cdata=array()) {
$cid = $cdata['id'] ? intval($cdata['id']) : '';
$croot = $cdata['root'];
if(!$cid && !$croot) return;
//Ðe×Ô¼ÓÅжÏ
//1¡¢cdata²»ÄÜΪ¶¥¼¶
if(!$croot) {
$sql = "SELECT name from tree where id = $cid";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
$croot = $row['name'];
unset($sql);
}
delete_tree_item($cdata,1);
insert_tree($pdata,$ndata,$croot,1);
}
/**
*ÓÃÓÚ²aÈeÒ»¸o½Úµa
*@param array $pdata = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò» ¸¸½Úµa(Ϊ¿Õʱ²aÈe×i´oµÄ¸¸½Úµa)
*@param array $ndata = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò» ÏÂÒ»¸oÐֵܽڵa£¨Ã»ÓÐÐֵܵÄʱºo¾Í²»Óã(C)
*@param string $name string вaÈeµÄÃu³Æ
*@param int $update ĬÈÏΪ¿Õ£¬Îª1ʱ¸uвaÈe
*/
function insert_tree($pdata=array(),$ndata=array(),$name,$update='') {
if(!$name) return;
$pid = $pdata['id'] ? intval($pdata['id']) : '';
$proot = $pdata['root'];
$nid = $ndata['id'] ? intval($ndata['id']) : '';
$nroot = $ndata['root'];
//Óи¸ÎÞÐÖ£¨×iСµÄ×Ó½Úµa£¬¸¸½ÚµaµÄ×iºoÒ»¸o¶u×Ó£(C)
if(($pid || $proot) && !($nid || $nroot)) {
$sql = $pid ? "SELECT lft, rgt FROM tree WHERE id = '{$pid}';" : "SELECT lft, rgt FROM tree WHERE name = '{$proot}';";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
unset($sql);
//нڵa
$lft = $row['rgt'];
$rgt = $lft+1;
if(!$update) {
$sql = "insert into tree values (null,'{$name}',$lft,$rgt,0);";
$sql1 = "update tree set rgt = rgt+2 where rgt >= {$row['rgt']}";
$sql2 = "update tree set lft = lft+2 where lft >= {$row['rgt']}";
} else {
$sql = "update tree set lft=$lft,rgt=$rgt,status=0 where name ='{$name}';";
$sql1 = "update tree set rgt = rgt+2 where status =0 and rgt >= {$row['rgt']}";
$sql2 = "update tree set lft = lft+2 where status =0 and lft >= {$row['rgt']}";
}
mysql_query($sql1);
mysql_query($sql2);
mysql_query($sql); //last add new data
}
//Óи¸ÓÐÐÖ
if(($pid || $proot) && ($nid || $nroot)) {
$sql = $nid ? "SELECT lft, rgt FROM tree WHERE id = '{$nid}';" : "SELECT lft, rgt FROM tree WHERE name = '{$nroot}';";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
unset($sql);
//нڵa
$lft = $row['lft'];
$rgt = $lft+1;
if(!$update) {
$sql = "insert into tree values (null,'{$name}',$lft,$rgt,0);";
$sql1 = "update tree set rgt = rgt+2 where rgt >= {$row['lft']};";
$sql2 = "update tree set lft = lft+2 where lft >= {$row['lft']};";
} else {
$sql = "update tree set lft=$lft,rgt=$rgt,status=0 where name ='{$name}';";
$sql1 = "update tree set rgt = rgt+2 where status = 0 and rgt >= {$row['lft']};";
$sql2 = "update tree set lft = lft+2 where status = 0 and lft >= {$row['lft']};";
}
mysql_query($sql1);
mysql_query($sql2);
mysql_query($sql); //last add new data
}
//ÎÞ¸¸ÎÞÐÖ(´oÀÐ)
if(!($pid || $proot) && !($nid || $nroot)) {
$sql = "SELECT max(`rgt`) as rgt FROM tree;";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
unset($sql);
//нڵa
$lft = 1;
$rgt = $row['rgt']+2;
if(!$update) {
$sql = "insert into tree values (null,'{$name}',$lft,$rgt,0);";
$sql1 = "update tree set rgt = rgt+1";
$sql2 = "update tree set lft = lft+1";
} else {
$sql = "update tree set lft=$lft,rgt=$rgt,status=0 where name ='{$name}';";
$sql1 = "update tree set rgt = rgt+1 where status = 0";
$sql2 = "update tree set lft = lft+1 where status = 0";
}
mysql_query($sql1);
mysql_query($sql2);
mysql_query($sql); //last add new data
}
}
/**
*ÓÃÓÚɾ³ýÒ»¸o½Úµa(°uÀ¨×Ó½Úµa)
*@param array $data = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò»
*@param int $update ĬÈÏΪ¿Õ£¬Îª1ʱÂ߼ɾ³ý
*/
function delete_tree_all($data,$update='') {
$id = $data['id'] ? intval($data['id']) : '';
$root = $data['root'];
if(!$id && !$root) return;
$sql = $id ? "SELECT lft, rgt FROM tree WHERE id = '{$id}';" : "SELECT lft, rgt FROM tree WHERE name = '{$root}';";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
unset($sql);
$middle = $row['rgt']-$row['lft']+1;
if(!$update) {
$sql = "delete from tree where lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."'";
$sql1 = "update tree set rgt = rgt-{$middle} where rgt > {$row['rgt']}";
$sql2 = "update tree set lft = lft-{$middle} where lft > {$row['rgt']}";
} else {
$sql = "update tree set status = 1 where lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."'";
$sql1 = "update tree set rgt = rgt-{$middle} where status=0 and rgt > {$row['rgt']}";
$sql2 = "update tree set lft = lft-{$middle} where status=0 and lft > {$row['rgt']}";
}
mysql_query($sql);
mysql_query($sql1);
mysql_query($sql2);
}
/**
*ÓÃÓÚɾ³ýÒ»¸o½Úµa(²»°uÀ¨×Ó½Úµa)
*@param array $data = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò»
*@param int $update ĬÈÏΪ¿Õ£¬Îª1ʱÂ߼ɾ³ý
*/
function delete_tree_item($data,$update='') {
$id = $data['id'] ? intval($data['id']) : '';
$root = $data['root'];
if(!$id && !$root) return;
$sql = $id ? "SELECT id,lft, rgt FROM tree WHERE id = '{$id}';" : "SELECT id,lft, rgt FROM tree WHERE name = '{$root}';";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
unset($sql);
if(!$update) {
$sql = "delete from tree where id = {$row['id']};";
$sql1 = "update tree set rgt = rgt-1,lft = lft -1 where lft > {$row['lft']} and rgt < {$row['rgt']}";
$sql2 = "update tree set lft = lft-2 where lft > {$row['rgt']}";
$sql3 = "update tree set rgt = rgt-2 where rgt > {$row['rgt']}";
} else {
$sql = "update tree set status = 1 where id = {$row['id']};";
$sql1 = "update tree set rgt = rgt-1,lft = lft -1 where status = 0 and lft > {$row['lft']} and rgt < {$row['rgt']}";
$sql2 = "update tree set lft = lft-2 where status = 0 and lft > {$row['rgt']}";
$sql3 = "update tree set rgt = rgt-2 where status = 0 and rgt > {$row['rgt']}";
}
mysql_query($sql);
mysql_query($sql1);
//can do or not do just right,but not do load empty 2 number in middle
mysql_query($sql2);
mysql_query($sql3);
}
/**
*ÓÃÓÚ»ñÈ¡ËuÓеĽڵa
*@param array $data = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò»
*/
function get_tree_all($data) {
$id = $data['id'] ? intval($data['id']) : '';
$root = $data['root'];
if(!$id && !$root) return;
$sql = $id ? "SELECT lft, rgt FROM tree WHERE id = '{$id}';" : "SELECT lft, rgt FROM tree WHERE name = '{$root}';";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
$adata = array(); //ËuÓÐÊý¾Ý
$right = array(); //¼ÆÊý
$prev = array();
$result = mysql_query("SELECT id,name, lft, rgt FROM tree WHERE lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."' ORDER BY lft ASC ;");
while ($row = mysql_fetch_assoc($result)) {
if (count($right) > 0) {
while ($right[count($right) - 1] < $row['rgt']) { // ¼i²eÎÒÃÇÊÇ*ñÓ¦¸Ã½«½ÚµaÒƳo¶ÑÕ»
array_pop($right);
array_pop($prev);
}
}
$parent = $prev ? end($prev) : '';
$adata[] = array('id'=>$row['id'],'name'=>$row['name'],'level'=>count($right),'parent'=>$parent);
$right[] = $row['rgt'];
$prev[] = $row['name'];
}
return $adata;
}
/**
*ÓÃÓÚչʾ*ÖÀa
*@param array $data = array('id'=>Ö÷¼u,'root'=>Ãu³Æ) ¶þÑ¡Ò»
*/
function display_tree($data) {
$id = $data['id'] ? intval($data['id']) : '';
$root = $data['root'];
if(!$id && !$root) return;
$sql = $id ? "SELECT lft, rgt FROM tree WHERE id = '{$id}';" : "SELECT lft, rgt FROM tree WHERE name = '{$root}';";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
$right = array();
$result = mysql_query("SELECT name, lft, rgt FROM tree WHERE lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."' ORDER BY lft ASC ;");
while ($row = mysql_fetch_assoc($result)) {
if (count($right) > 0) { // ¼i²eÎÒÃÇÊÇ*ñÓ¦¸Ã½«½ÚµaÒƳo¶ÑÕ»
while ($right[count($right) - 1] < $row['rgt']) {
array_pop($right);
}
}
echo str_repeat(' ',count($right)) . $row['name'] . "\n";
$right[] = $row['rgt'];
}
}
mysql_connect('localhost','root','') or die('connect error');
mysql_select_db('test') or die('database error');
mysql_query('set names utf8');
display_tree(array('root'=>'Food'));
//display_tree(array('root'=>'bigboss'));
//move_tree_all($pdata=array('root'=>'Fruit'),$ndata=array('root'=>'Red'),$cdata=array('root'=>'Meat'));
//move_tree_all('','',$cdata=array('root'=>'Meat'));
//move_tree_item('','',array('root'=>'Red'));
//move_tree_item(array('root'=>'Red'),array('root'=>'Cherry'),array('root'=>'Fruit'));
//delete_tree_all(array('root'=>'Yellow'));
//delete_tree_all(array('root'=>'Meat'));
//delete_tree_item(array('root'=>'Meat'));
//insert_tree('','','bigboss');
//insert_tree(array('root'=>'Red'),'','dalao');
//insert_tree(array('root'=>'Red'),array('root'=>'Cherry'),'baddalao');
//insert_tree(array('root'=>'Fruit'),array('root'=>'Red'),'Redbother');
display_tree(array('root'=>'Food'));
¸u¶a¹ØÓÚPHPÏa¹ØÄÚÈݸÐÐËȤµÄ¶ÁÕ߿ɲe¿´±¾Õ¾×¨Ìa£º¡¶php×Öu´®(string)Óè×ܽa¡¡¢¡¶PHPÊý×e(Array)²Ù×÷¼¼ÇÉ´oÈ«¡¡¢¡¶PHP»u±¾Ói*¨ÈeÃŽ̡̳¡¢¡¶[PHPÔËËaÓeÔËËauÓè×ܽa](http://www.jb51.net/Special/357.htm)¡¡¢¡¶phpÃaeÏo¶ÔÏo³ÌÐoÉe¼ÆÈeÃŽ̡̳¡¢¡¶PHPÍøÂç±a³Ì¼¼ÇÉ×ܽa¡¡¢¡¶php+mysqlÊý¾Ý¿a²Ù×÷ÈeÃŽ̡̳¼°¡¶php³£¼uÊý¾Ý¿a²Ù×÷¼¼ÇÉ»a×Ü¡
Ï£Íu±¾ÎÄËuÊo¶Ô´o¼ÒPHP³ÌÐoÉe¼ÆÓÐËu°iÖu¡£