我知道我這麼寫 是很慢的
我知道思路 但是做不出來
應該一次性將所有資料取出來
然後排序 求賜教
function getBookmarkcategory($pid = 0, &$result = array(), $spac = 0) { if(MODULE_NAME=="Home"){ $ispublic=0; $uid=session('uid'); $ispublic+="And bookmarkcategory_staffid = $uid"; }else if(MODULE_NAME=="Admin"){ $ispublic=1; } $Model = new Model(); $spac = $spac + 8; $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort"); foreach($res as $key=>$value){ $result[]=$res[$key]; getBookmarkcategory($value['bookmarkcategory_id'],$result,$spac); } return $result; } $list = getBookmarkcategory(); return $list;
回複內容:
我知道我這麼寫 是很慢的
我知道思路 但是做不出來
應該一次性將所有資料取出來
然後排序 求賜教
function getBookmarkcategory($pid = 0, &$result = array(), $spac = 0) { if(MODULE_NAME=="Home"){ $ispublic=0; $uid=session('uid'); $ispublic+="And bookmarkcategory_staffid = $uid"; }else if(MODULE_NAME=="Admin"){ $ispublic=1; } $Model = new Model(); $spac = $spac + 8; $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort"); foreach($res as $key=>$value){ $result[]=$res[$key]; getBookmarkcategory($value['bookmarkcategory_id'],$result,$spac); } return $result; } $list = getBookmarkcategory(); return $list;
不說需求,表結構,誰知道那麼一坨代碼是幹嗎用的
php無限分類 一種演算法 可以參考 PHPCMS category 表結構。它是把所有的父(樹)結點與子(樹)結點都遞迴存入資料庫。可以一次記取存所有資料到數組再遞迴。
可以參考下面問題的答案,“分類”和許可權管理中的部門類似
http://segmentfault.com/q/1010000004365843/a-1020000004365952
$res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort");
應該是慢在這裡,完全可以想辦法不要放到遞迴裡面查詢,先一次性查詢出來,然後遞迴也比這個快N倍啊
function getBookmarkcategory($pid = 0, &$result = array(), $spac = 0) { if(MODULE_NAME=="Home"){ $ispublic=0; $uid=session('uid'); $ispublic+="And bookmarkcategory_staffid = $uid"; }else if(MODULE_NAME=="Admin"){ $ispublic=1; } $Model = new Model();//竟然是遞迴 每次尋環 都要執行個體模型 慢的原因 之一 放到函數外面 $spac = $spac + 8; $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort"); //SELECT * 這種寫法 效能低 bookmarkcategory_pid=$pid--bookmarkcategory_pid 是否索引 foreach($res as $key=>$value){ $result[]=$res[$key]; getBookmarkcategory($value['bookmarkcategory_id'],$result,$spac); } return $result; } //速度最好的是 資料一次在外部取出 再來遞迴 很快 mysql 操作很慢的
一次查詢查出所有,然後迴圈,使用傳值引用調整資料結構,然後就出來了
可以用左右值樹
http://wenku.baidu.com/view/cb2bb3eeaeaad1f346933ffd.html
效率非常高
可以用資料字典做,一次性拿出全部資料,再迴圈一次即可
因為你在不停地從外部儲存讀取資料。如果資料量不大,一次性可以把所有需要的資料讀取出來,然後在記憶體中構造樹。哪些是需要的資料在資料產生的時候就可以把關聯表儲存下來。如果資料量非常大,可以考慮按樹的層級儲存關聯資料,分幾次讀取。
PS: 看你的代碼裡,要小心SQL注入