<?
require_once("echo.php");
?>
<html>
<head>
<title>生成多级分类树测试-〉搜字符串法</title>
<link rel="stylesheet" href="base.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<style>
body {
scrollbar-base-color:#517CEA;scrollbar-arrow-color:#FFFFFF;
font:14px verdana;
}
*{line-height:1;margin:0px;PADDING:0px;}
</style>
<body bgcolor="#FFFFFF">
<pre>
<?php
//$q = "select CONCAT_WS( '_', id , pid) as indexKey , CONCAT_WS('_' , title , link , published , ordering , access , params ) as valueKey from #__collector_menu where access>=0 ";
/**
* 共计查找数据库两次,使用CONCAT_WS函数两次
* 使用正则搜数组一次(N条记录)*N次(N*X条记录)*(N*X)次(Y条记录,依次类推)。
* 对于2级类,则是 2数据库+1*N次正则。
* 如果用数据库,则是1数据库 * N次数据库。
* 如果用数组遍历,则是1数据库(Y条记录)+N*Y+(Y-N)次数组循环。
* 如果用字符串,将所有记录穿成一个字符串,然后用正则递归搜,将面临搜到字串后要分割字串的问题。
* 臆测字串搜起来恐怕比数组搜索要效率高一些。
*
* 不知道哪个效率更高。不过我想,无论如何从内存搜应该比从数据库里搜要快吧
* 而内存中搜,用正则和数组遍历的比较。对于大记录数组遍历的循环次数将会恐怖地增长。
* 然而我不知道preg_grep在数组中搜索是否和普通数组循环一样。如果是,那么。二者恐怕效率差不多。
* 这次我用string
* 比起数组搜索法来,速度下降了10倍多,27条记录(6x4),。100次/5秒
*
*/
//时间开始
$timeStart = getmicrotime();
$tree = new TreeMenu;
$tree->start();
echo $tree->menu;
//时间结束
$timeEnd = getmicrotime();
echo ($timeEnd-$timeStart)."<br/>";
class TreeMenu{
var $catString;
var $pid=0;
var $menu='┌◎\n';
function start(){
$this->genCatString();
/* 搜出所有的$pid下的类别,初始化 */
$pid=0;
$reg = "#([0-9]+),(".$pid."),(.*?),(.*?)\n#m";
preg_match_all($reg,$this->catString,$row); //prt($row);
if (count($row[0])==0) {
return;
}
else {
$this->menu="┌◎\n";
$this->getTreeMenuStr($pid,0,0,$row);
}
}//end func
function getTreeMenuStr($pid=0,$level=0,$blanklevel=0,&$row=array()){
//return;
$pre="";
for ($k=0;$k<$level ;$k++ ) {
$pre .="│";//echot($level);
}
for ($k=0;$k<$blanklevel ;$k++ ) {
$pre .=" ";//echot($level);
}
/* 控制 */
$totmain = count($row[0])-1;
$toti=0;
$n=count($row[0]);
for ($i=0;$i<$n ;$i++ ) {
$nextlevel = $level;
$nextPid = $row[1][$i];
$link = $row[4][$i];
$title = $row[3][$i];
/* 找出下级类别 */
$reg = "#([0-9]+),(".$nextPid."),(.*?),(.*?)\n#m";
preg_match_all($reg,$this->catString,$subRow); //prt($subRow);
$totsub = count($subRow[0]);
if ($toti<$totmain) {
$this->menu .=$pre.'├'.$title."\n";
}
else {
$this->menu .=$pre.'└'.$title."\n";
}
if ($totsub>0) {
if ($toti<$totmain) {
$nextlevel=$level+1;
}
else { //本级类别最后一个类别的子类
$blanklevel++;
}
$this->getTreeMenuStr($nextPid,$nextlevel,$blanklevel,$subRow);
}
$toti++;
}//fori
}//end func
function genCatString(){
$this->catString=<<<EOD
66,0,<a href="#" target="_parent">退出DEDECMS</a>,#
67,0,频道管理,#
68,67,板块模板管理,../web_type_web.php
69,67,通用模板管理,../file_view.php
70,69,主页创建向导,../add_home_page.php
71,0,内容维护,#
72,71,待审核文章,../list_news_member.php
73,71,专题管理,../list_news_spec.php
74,71,评论管理,../list_feedback.php
75,0,内容发布,#
76,75,专题创建向导,../add_news_spec.php
77,75,图集发布向导,../add_news_pic.php
78,75,软件发布向导,../add_news_soft.php
79,75,Flash向导,../add_news_flash.php
80,0,附助功能,#
81,80,友情链接管理,../add_friendlink.php
82,80,投票管理,../add_vote.php
83,80,论坛扩展,../bbs_addons.php
84,80,留言簿管理,/guestbook/index.php
85,0,会员管理,#
86,85,网上会员管理,../list_user.php
87,0,文件管理,#
88,87,文件浏览器,../file_view.php
89,0,数据库管理,#
90,89,数据备份/还原,../sys_back_data.php
91,89,MySQL命令,../sys_domysql.php
92,0,系统帮助,#
93,92,系统信息,../blank.php
EOD;
}
}//end class
?>
</body>
</html>
require_once("echo.php");
?>
<html>
<head>
<title>生成多级分类树测试-〉搜字符串法</title>
<link rel="stylesheet" href="base.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<style>
body {
scrollbar-base-color:#517CEA;scrollbar-arrow-color:#FFFFFF;
font:14px verdana;
}
*{line-height:1;margin:0px;PADDING:0px;}
</style>
<body bgcolor="#FFFFFF">
<pre>
<?php
//$q = "select CONCAT_WS( '_', id , pid) as indexKey , CONCAT_WS('_' , title , link , published , ordering , access , params ) as valueKey from #__collector_menu where access>=0 ";
/**
* 共计查找数据库两次,使用CONCAT_WS函数两次
* 使用正则搜数组一次(N条记录)*N次(N*X条记录)*(N*X)次(Y条记录,依次类推)。
* 对于2级类,则是 2数据库+1*N次正则。
* 如果用数据库,则是1数据库 * N次数据库。
* 如果用数组遍历,则是1数据库(Y条记录)+N*Y+(Y-N)次数组循环。
* 如果用字符串,将所有记录穿成一个字符串,然后用正则递归搜,将面临搜到字串后要分割字串的问题。
* 臆测字串搜起来恐怕比数组搜索要效率高一些。
*
* 不知道哪个效率更高。不过我想,无论如何从内存搜应该比从数据库里搜要快吧
* 而内存中搜,用正则和数组遍历的比较。对于大记录数组遍历的循环次数将会恐怖地增长。
* 然而我不知道preg_grep在数组中搜索是否和普通数组循环一样。如果是,那么。二者恐怕效率差不多。
* 这次我用string
* 比起数组搜索法来,速度下降了10倍多,27条记录(6x4),。100次/5秒
*
*/
//时间开始
$timeStart = getmicrotime();
$tree = new TreeMenu;
$tree->start();
echo $tree->menu;
//时间结束
$timeEnd = getmicrotime();
echo ($timeEnd-$timeStart)."<br/>";
class TreeMenu{
var $catString;
var $pid=0;
var $menu='┌◎\n';
function start(){
$this->genCatString();
/* 搜出所有的$pid下的类别,初始化 */
$pid=0;
$reg = "#([0-9]+),(".$pid."),(.*?),(.*?)\n#m";
preg_match_all($reg,$this->catString,$row); //prt($row);
if (count($row[0])==0) {
return;
}
else {
$this->menu="┌◎\n";
$this->getTreeMenuStr($pid,0,0,$row);
}
}//end func
function getTreeMenuStr($pid=0,$level=0,$blanklevel=0,&$row=array()){
//return;
$pre="";
for ($k=0;$k<$level ;$k++ ) {
$pre .="│";//echot($level);
}
for ($k=0;$k<$blanklevel ;$k++ ) {
$pre .=" ";//echot($level);
}
/* 控制 */
$totmain = count($row[0])-1;
$toti=0;
$n=count($row[0]);
for ($i=0;$i<$n ;$i++ ) {
$nextlevel = $level;
$nextPid = $row[1][$i];
$link = $row[4][$i];
$title = $row[3][$i];
/* 找出下级类别 */
$reg = "#([0-9]+),(".$nextPid."),(.*?),(.*?)\n#m";
preg_match_all($reg,$this->catString,$subRow); //prt($subRow);
$totsub = count($subRow[0]);
if ($toti<$totmain) {
$this->menu .=$pre.'├'.$title."\n";
}
else {
$this->menu .=$pre.'└'.$title."\n";
}
if ($totsub>0) {
if ($toti<$totmain) {
$nextlevel=$level+1;
}
else { //本级类别最后一个类别的子类
$blanklevel++;
}
$this->getTreeMenuStr($nextPid,$nextlevel,$blanklevel,$subRow);
}
$toti++;
}//fori
}//end func
function genCatString(){
$this->catString=<<<EOD
66,0,<a href="#" target="_parent">退出DEDECMS</a>,#
67,0,频道管理,#
68,67,板块模板管理,../web_type_web.php
69,67,通用模板管理,../file_view.php
70,69,主页创建向导,../add_home_page.php
71,0,内容维护,#
72,71,待审核文章,../list_news_member.php
73,71,专题管理,../list_news_spec.php
74,71,评论管理,../list_feedback.php
75,0,内容发布,#
76,75,专题创建向导,../add_news_spec.php
77,75,图集发布向导,../add_news_pic.php
78,75,软件发布向导,../add_news_soft.php
79,75,Flash向导,../add_news_flash.php
80,0,附助功能,#
81,80,友情链接管理,../add_friendlink.php
82,80,投票管理,../add_vote.php
83,80,论坛扩展,../bbs_addons.php
84,80,留言簿管理,/guestbook/index.php
85,0,会员管理,#
86,85,网上会员管理,../list_user.php
87,0,文件管理,#
88,87,文件浏览器,../file_view.php
89,0,数据库管理,#
90,89,数据备份/还原,../sys_back_data.php
91,89,MySQL命令,../sys_domysql.php
92,0,系统帮助,#
93,92,系统信息,../blank.php
EOD;
}
}//end class
?>
</body>
</html>