遞迴解決無限級分類的問題

來源:互聯網
上載者:User

小弟手中有分類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

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.