<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>shooting's sky &#187; 无限分类</title>
	<atom:link href="http://anfirst.cn/archives/tag/%e6%97%a0%e9%99%90%e5%88%86%e7%b1%bb/feed" rel="self" type="application/rss+xml" />
	<link>http://anfirst.cn</link>
	<description>专心每一天</description>
	<lastBuildDate>Thu, 15 Dec 2011 13:28:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>再写关于无限分类</title>
		<link>http://anfirst.cn/archives/950</link>
		<comments>http://anfirst.cn/archives/950#comments</comments>
		<pubDate>Tue, 06 Apr 2010 13:07:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[全部文章]]></category>
		<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[无限分类]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=950</guid>
		<description><![CDATA[数据表里的结构还是非常简单 三个字段id , parentid ,name 算法也很简单递归，以前用递归的时候很傻，应该说极傻，因为在递归中通过查询数据表来获得子类的所有，最近开窍了，想到了一个地球人都能想得到的方法，下面是代码，一个class &#60;?php class Tree {  /**   * 从数据库查询出的所有分类信息   * @var array   */  var $arr; /**  * 如下格式  *  var $arr = array(  1 =&#62; array(&#8216;id&#8217;=&#62;&#8217;1&#8242;,&#8217;parentid&#8217;=&#62;0,&#8217;name&#8217;=&#62;&#8217;一级栏目一&#8217;),  2 =&#62; array(&#8216;id&#8217;=&#62;&#8217;2&#8242;,&#8217;parentid&#8217;=&#62;0,&#8217;name&#8217;=&#62;&#8217;一级栏目二&#8217;),  3 =&#62; array(&#8216;id&#8217;=&#62;&#8217;3&#8242;,&#8217;parentid&#8217;=&#62;1,&#8217;name&#8217;=&#62;&#8217;二级栏目一&#8217;),  );*/  /**   * 输出结构   * @var array   */  var $tree = array();  /** [...]]]></description>
			<content:encoded><![CDATA[<p>数据表里的结构还是非常简单<br />
三个字段id , parentid ,name<br />
算法也很简单递归，以前用递归的时候很傻，应该说极傻，因为在递归中通过查询数据表来获得子类的所有，最近开窍了，想到了一个地球人都能想得到的方法，下面是代码，一个class</p>
<blockquote><p>&lt;?php<br />
class Tree {</p>
<p> /**<br />
  * 从数据库查询出的所有分类信息<br />
  * @var array<br />
  */<br />
 var $arr;<br />
/**<br />
 * 如下格式<br />
 *  var $arr = array(<br />
 1 =&gt; array(&#8216;id&#8217;=&gt;&#8217;1&#8242;,&#8217;parentid&#8217;=&gt;0,&#8217;name&#8217;=&gt;&#8217;一级栏目一&#8217;),<br />
 2 =&gt; array(&#8216;id&#8217;=&gt;&#8217;2&#8242;,&#8217;parentid&#8217;=&gt;0,&#8217;name&#8217;=&gt;&#8217;一级栏目二&#8217;),<br />
 3 =&gt; array(&#8216;id&#8217;=&gt;&#8217;3&#8242;,&#8217;parentid&#8217;=&gt;1,&#8217;name&#8217;=&gt;&#8217;二级栏目一&#8217;),<br />
 );*/</p>
<p> /**<br />
  * 输出结构<br />
  * @var array<br />
  */<br />
 var $tree = array();<br />
 /**<br />
  * 树形递归的深度<br />
  * @var int<br />
  */<br />
 var $deep = 1;</p>
<p> /**<br />
  * 生成树形的修饰符号<br />
  * @var array<br />
  */<br />
 var $icon = array(&#8216;│&#8217;,'├&#8217;,'└&#8217;);<br />
 /**<br />
  * 生成指定id的下级树形结构<br />
  * @param int $rootid 要获取树形结构的id<br />
  * @param string $add 递归中使用的前缀<br />
  * @param bool $parent_end 标识上级分类是否是最后一个<br />
  */<br />
 function getTree($rootid = 0,$add = ”,$parent_end =true){<br />
  $is_top = 1;<br />
  $child_arr = $this-&gt;getChild($rootid);<br />
  if(is_array($child_arr)){<br />
   $cnt = count($child_arr);<br />
   foreach($child_arr as $key =&gt; $child){<br />
    $cid = $child['id'];<br />
    $child_child = $this-&gt;getChild($cid);<br />
    if($this-&gt;deep &gt;1){<br />
     if($is_top == 1 &amp;&amp; $this-&gt;deep &gt; 1){<br />
      $space = $this-&gt;icon[1];<br />
      if(!$parent_end)<br />
      $add .=  $this-&gt;icon[0];<br />
      else $add .= &#8216;&amp;nbsp;&amp;nbsp;&#8217;;<br />
     }</p>
<p>     if($is_top == $cnt){<br />
      $space = $this-&gt;icon[2];<br />
      $parent_end = true;<br />
     }else {<br />
      $space = $this-&gt;icon[1];<br />
      $parent_end = false;<br />
     }<br />
    }<br />
    $this-&gt;tree[] = array(&#8216;spacer&#8217;=&gt;$add.$k.$space,<br />
           &#8216;name&#8217;=&gt;$child['name'],<br />
           &#8216;id&#8217;=&gt;$cid<br />
    );<br />
    $is_top++;</p>
<p>    $this-&gt;deep++;<br />
    if($this-&gt;getChild($cid))<br />
    $this-&gt;getTree($cid,$add,$parent_end);<br />
    $this-&gt;deep&#8211;;</p>
<p>   }</p>
<p>  }<br />
  return $this-&gt;tree;<br />
 }</p>
<p> /**<br />
  * 获取下级分类数组<br />
  * @param int $root<br />
  */<br />
 function getChild($root = 0){</p>
<p>  $a = $child = array();<br />
  foreach($this-&gt;arr as $id=&gt;$a){<br />
   if($a['parentid'] == $root){<br />
    $child[$a['id']] = $a;<br />
   }<br />
  }<br />
  return $child?$child:false;<br />
   <br />
 }<br />
 /**<br />
  * 设置源数组<br />
  * @param $arr<br />
  */<br />
 function setArr($arr = array()){<br />
  $this-&gt;arr = $arr;<br />
 }<br />
}</p></blockquote>
<p>通过一次查询把结构保存进一个数组，再数组进行递归运算，无疑极大的提高了程序运行效率<br />
使用代码很简单，得到查询结构后setArr，直接调用getTree, 皆可以得到按照程序排序号并带有前缀修饰等信息的数组，到这里通过foreach这个数组就可以得到如下的树状列表了</p>
<blockquote><p>水果   <br />
  ├香蕉<br />
  ├苹果<br />
  │├红富士<br />
  │└海南苹果<br />
  └桃子</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/950/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

