<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[关于PHP实现无限分类的方法探索]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 14 May 2010 16:25:23 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	无限分类的方法很多，现在比较流行的是使用父ID来实现，而使用父ID一般是使用递归来实现，以下我用两种方法来实现。<br/><br/>首先我们先建立以下数据表：(sort表)<br/><br/><br/><br/><div class="code">id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name <br/>int(主键)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar </div><br/><br/>先说明一下这个数据表的意义，id是唯一的，而pid就是父分类的id，name就是分类的名称。<br/><br/>我们首先约定一下，当pid为0的时候就是顶级分类，而不为0的时候就是子分类。<br/><br/>第一种实现方法： <br/>第一种实现方法的思路是把pid为0的分类取出来，然后再以这些顶级分类的id作为父id来取得他们的子分类，然后再以他们的子分类id作为父id，如此一直循环下去，直到把所有的分类都取完。代码如下：<br/><br/><br/><br/><div class="code">&lt;?php<br/>$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库<br/>function get_sort_list($pid) &#123;<br/>global $conn;<br/>$sql = “SELECT * FROM sort WHERE pid=‘0’”;<br/>$query = mysql_query($sql, $conn);<br/>While ($row = mysql_fetch_array($query)) &#123;<br/>echo $row&#91;‘name’&#93;;<br/>get_sort_list($row&#91;‘id’&#93;);<br/>&#125;<br/>&#125;<br/>get_sort_list(0);//以pid为0作为开始<br/>?&gt; </div><br/><br/>上面的代码我们使用了递归的方法来实现，不过当我们运行的时候会发现分类没有分层，全部都是在一个层次，一点都不美观，所以我们可以添加一个级别给他，怎么做呢？<br/><br/><br/><div class="code">&lt;?php<br/>$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库<br/><br/>function get_sort_list($pid, $leven) &#123;<br/>global $conn;<br/>$sql = “SELECT * FROM sort WHERE pid=‘0’”;<br/>$query = mysql_query($sql, $conn);<br/>While ($row = mysql_fetch_array($query)) &#123;<br/>for ($i = 0; $i &lt; $leven; $i++) &#123;<br/>echo ‘&amp;nbsp;&amp;nbsp;&amp;nbsp;’;<br/>&#125;<br/>echo $row&#91;‘name’&#93;;<br/>get_sort_list($row&#91;‘id’&#93;, $leven + 1);<br/>&#125;<br/>&#125;<br/><br/>get_sort_list(0, 0);//以pid为0, leven为0作为开始调用函数<br/>?&gt; </div><br/><br/>这样修改之后我们会发现分类分层了。<br/><br/>第二种实现方法： <br/>我们发现在第一种方法中，每次取得一个分类都要查询一次数据库，如果分类多的话（好似淘宝那样）速度是非常不乐观的，那我们怎么来重构他呢？<br/><br/>我们可以先一次把所有的分类都取出来，然后再用PHP去处理他。而原理跟第一种方法差不多，都是根据pid去获得子分类。实现方法如下：<br/><br/><br/><br/><div class="code">&lt;?php<br/>$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库<br/>$query = mysql_query(“SELECT * FROM sort”);<br/>$sorts = array();<br/>//取出所有分类<br/>While($row = mysql_fetch_array($query)) &#123;<br/>$sorts&#91;&#93; = $row;<br/>&#125;<br/><br/>function get_sort_list($pid, $leven) &#123;<br/>global $sorts;<br/>foreach ($sorts as $sort) &#123;<br/>if ($sort&#91;‘pid’&#93; == $pid) &#123;//如果当前分类的pid等于要获取的pid<br/>for ($i = 0; $i &lt; $leven; $i++) echo ‘&amp;nbsp;&amp;nbsp;&amp;nbsp;’;<br/>echo $sort&#91;‘name’&#93;;<br/>get_sort_list($sort&#91;‘id’&#93;, $leven + 1);<br/>&#125;<br/>&#125;<br/>&#125;<br/><br/>get_sort_list(0, 0);//以pid为0, leven为0作为开始调用函数<br/>?&gt; </div><br/><br/>好了，现在只查询一次数据库就可以实现第一种方法了。<br/>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 关于PHP实现无限分类的方法探索]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>