小弟手中有分類3406條,存在category表中。現在用遞迴解決分類,做成select,如:
下面是PHP代碼,但是產生select後有錯誤:
// $result是從資料庫中讀出的二維數組$result = array();while (($row = $info->fetch_array(MYSQLI_ASSOC)) != false) { // 改變數組的索引為分類的id $result[$row['id']] = $row;}$str = '';$str .= ""; foreach ($result as $value) { if ($value['parent_id'] == 0) { $str .= "{$value['title']}"; $str .= get_children($value['id'], $result, 1); } }$str .= "";function get_children($id, &$result, $index) { $str = ''; foreach ($result as $key => $value) { if ($id == $value['parent_id']) { $str .= "".str_repeat('---', $index)."{$value['title']}"; $str .= get_children($value['id'], $result, $index + 1); unset($result[$value['id']]); // 存在並且去掉這個以為數組 //echo count($result).'
'; } } return $str;} // 列印出select echo $str;
上面代碼中,去掉unset執行最後的結果是對的,但是執行時間一般在八九秒。我的想法是存在這一條後把這一條從result結果集中去掉,這樣的話以後迴圈的時候減少迴圈的次數,然後就能減少執行的時間,但是執行的結果是不對的,只存在省下面的一個地市,其餘的地市沒有了,研究了半天,也沒有發現哪裡錯,請大神指正。
PS: 1。第一次發帖,不怎麼會用,請諒解小弟。
2。有沒有更好的辦法遞迴3400多個分類。。
3.謝謝。。
回複內容:
小弟手中有分類3406條,存在category表中。現在用遞迴解決分類,做成select,如:
下面是PHP代碼,但是產生select後有錯誤:
// $result是從資料庫中讀出的二維數組$result = array();while (($row = $info->fetch_array(MYSQLI_ASSOC)) != false) { // 改變數組的索引為分類的id $result[$row['id']] = $row;}$str = '';$str .= ""; foreach ($result as $value) { if ($value['parent_id'] == 0) { $str .= "{$value['title']}"; $str .= get_children($value['id'], $result, 1); } }$str .= "";function get_children($id, &$result, $index) { $str = ''; foreach ($result as $key => $value) { if ($id == $value['parent_id']) { $str .= "".str_repeat('---', $index)."{$value['title']}"; $str .= get_children($value['id'], $result, $index + 1); unset($result[$value['id']]); // 存在並且去掉這個以為數組 //echo count($result).'
'; } } return $str;} // 列印出select echo $str;
上面代碼中,去掉unset執行最後的結果是對的,但是執行時間一般在八九秒。我的想法是存在這一條後把這一條從result結果集中去掉,這樣的話以後迴圈的時候減少迴圈的次數,然後就能減少執行的時間,但是執行的結果是不對的,只存在省下面的一個地市,其餘的地市沒有了,研究了半天,也沒有發現哪裡錯,請大神指正。
PS: 1。第一次發帖,不怎麼會用,請諒解小弟。
2。有沒有更好的辦法遞迴3400多個分類。。
3.謝謝。。
關聯式資料庫中的無限深度樹狀關係的表示有兩種常見方案:
- edge list tree(又寫作adjacency list,即鄰接表)
一行的表示類似於(子項目id, 父元素id)
- nested set tree(即左右值)
一行的表示類似於(當前元素左值, 當前元素右值)
相信樓主用的是前者,這樣的壞處是需要遞迴查詢。而後者更易於查詢,一條sql即可搞定,見@沙渺 的這篇文章。
針對lz的問題,如果嵌套關係表示使用的是左右值方法,拿到全量資料的前提下,在PHP中也可以用O(n)方式迭代資料得到所有需要的子節點和深度等資料,非常簡單。
如果只是需要在前端使用這些樹狀資料,那麼公子的方案是最簡單的,比用資料庫鄰接表、伺服器端遞迴遍曆簡單多了。
關於nested set:
- WIKI: Nested Set Model
- Nested Set的主要使用流程(常用查詢,增刪節點的方式等)
- nested set與adjacency list效率比較,以及如何使用R-tree索引進行進一步提速
- 一個把edge list轉化為nested set的mysql預存程序
這種東西幹嘛要存到資料庫中啊 =_=! http://www.soulteary.com/2013/05/10/jquery-city-select.html