新用户注册恢复喜悦村十周年

无限分类只要读一次数据库(附代码)

好久没来了,昨天看到一位朋友的帖子说无限分类很简单,看完后多说了点,事后也觉得不太应该,
大家爱学,我就把我们一个商业程序中的无限分类拿出来,可能有不尽意的地方,同时也希望村民能给意见或建议
下面是无限分类的数据表
附件: 您所在的用户组无法下载或查看附件
未名工作室http://www.qqwm.com
网站后台开发,PERL,PHP,JSP
这样显示会好看清一些
附件: 您所在的用户组无法下载或查看附件
未名工作室http://www.qqwm.com
网站后台开发,PERL,PHP,JSP
上面这张图上显示的2次查询,取出显示分类也只是用了1次
下面我把在选择框里显示的代码COPY发出来
因为是全COPY的,我们在实际运用中还有缓存,所以函数一开始是读缓存,缓存不存在时才读数据库(这样的好处是在实际应用中显示一个无限分类可以不用读数据库)
函数输出是一个完全处理好了的数组,在smarty中只要显示该数组就完全可以了。


[php]

        /**
        * 未名新闻专用函数
        * @ return array
        * (c) www.wmstudio.cn
        */
        function get_cat_options()
        {
                global $news_categories;

                $cat_array = array();

                $cat_array['thread'] = array();

                if (empty($news_categories)) // 如果之前的程序中取出了类别,就不再读缓存
                {
                        @include( C_PATH_CACHE . 'categories' . PHPEX ); // 调入缓存的类别数组$news_categories
                }

                if (empty($news_categories)) // 如果缓存不存在,读数据库取出
                {
                        unset($sql);

                        $sql = 'SELECT *'
                                 . ' FROM ' . TABLE_ART_CATEGORIES
                                 . ' ORDER BY cat_grouporder ASC, cat_group ASC, cat_order ASC';

                        if ( FALSE !== $result = db_query( $sql ) )
                        {
                                while ( $catrow = db_fetch_array($result) )
                                {
                                        $cat_array['thread'][$catrow['cat_parentid']]++;

                                        $cat_array['catrows'][] = $catrow;
                                }

                                $cat_array_count = db_num_rows($result);
                        }
                        else
                        {
                                return (boolean) FALSE;
                        }
                }
                else
                {
                        foreach ($news_categories as $catrow)
                        {
                                $cat_array['thread'][$catrow['cat_parentid']]++;

                                $cat_array['catrows'][] = $catrow;
                        }

                        $cat_array_count = count($news_categories);
                }

               

                $p_catoptions = array();

                unset($catrow);

                for ($i = 0; $i < $cat_array_count; $i++)
                {
                        $icon = '';

                        $space = '';

                        $catrow = '';

                        $catrow = $cat_array['catrows'][$i];

                        $cat_tree[$catrow['cat_level'] + 1] = $cat_array['thread'][$catrow['cat_id']];

                        $cat_tree[$catrow['cat_level']]--;

                        for ($ii = 0; $ii < $catrow['cat_level']; $ii++)
                        {
                                if ($cat_tree[$ii] > 0)
                                {
                                        $space .= '┃';
                                }
                                else
                                {
                                        $space .= '&nbsp;&nbsp;';
                                }
                        }

                        if ($cat_tree[$catrow['cat_level']] > 0)
                        {
                                $space .= '┣';
                        }
                        elseif ($cat_tree[$catrow['cat_level']] == 0 && $catrow['cat_parentid'] != 0)
                        {
                                $space .= '┗';
                        }

                        //$space = str_repeat('---', $catrow['cat_level']);
               
                        $p_catoptions[$catrow['cat_id']] = $space . $catrow['cat_name'];

                        // $t_assign['catname'][$catrow['cat_id']] = $space . $catrow['cat_name'];
                }

                return $p_catoptions;
        }
[/php]
未名工作室http://www.qqwm.com
网站后台开发,PERL,PHP,JSP
好久没有见到这样的帖子了!
link:gaoxiao2.com  淘宝网女装  
link:bjgp.net  北京股票论坛
收下...........
收了,谢.
顶了先说

组号是么子意思?
组号其实就是顶级类别的ID,说白一点就是“祖宗”,一个祖宗有很多子子孙孙,但是这些子子孙孙是同一个祖宗的。从我上面的图片例子来说,“新闻”是一个组,“文学”是一个组;

组与组之间排序就很容易理解了;

因为有组与组之间排序,所以取出数据时只要
ORDER BY cat_grouporder ASC, cat_group ASC, cat_order ASC';
就行了

用楼顶的数据表你可以自己写一个读取代码试试
未名工作室http://www.qqwm.com
网站后台开发,PERL,PHP,JSP
感谢LZ分享!
留一脚

但是:如果分类就几百个,就算是只读一次花的时间也不小。
风云山庄  群号:6025396/6025252/19520091 强者并非压倒一切,而是不被一切压倒!