<?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>Zend Framework Blog &#187; Adjacency list model</title>
	<atom:link href="http://blog.richardknop.com/tag/adjacency-list-model/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.richardknop.com</link>
	<description>Zend Framework, PHP, Django, Python, SQL, MySQL, PostgreSQL, Oracle, PL/SQL, data model patterns, OOP, design patterns, JavaScript, jQuery, HTML, XHTML, CSS, XML, web services &#38; APIs, Security, E-commerce and much more</description>
	<lastBuildDate>Sat, 04 Feb 2012 19:47:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Adjacency list model</title>
		<link>http://blog.richardknop.com/2009/05/adjacency-list-model/</link>
		<comments>http://blog.richardknop.com/2009/05/adjacency-list-model/#comments</comments>
		<pubDate>Tue, 19 May 2009 15:26:46 +0000</pubDate>
		<dc:creator>Richard Knop</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Adjacency list model]]></category>

		<guid isPermaLink="false">http://blog.richardknop.com/?p=121</guid>
		<description><![CDATA[Managing hierarchical data in relational databases (such as MySQL) is a troublesome task because relational databases were not designed to store hierarchical data. MySQL tables are just flat files with no representation of a parent-child relationship. There are two methods that are usually used to store hierarchical data in MySQL: adjacency list model modified tree [...]]]></description>
			<content:encoded><![CDATA[<p>Managing hierarchical data in relational databases (such as MySQL) is a troublesome task because relational databases were not designed to store hierarchical data. MySQL tables are just flat files with no representation of a parent-child relationship. There are two methods that are usually used to store hierarchical data in MySQL:</p>
<ul>
<li>adjacency list model</li>
<li><a href="http://blog.richardknop.com/2009/05/nested-set-model/">modified tree preorder traversal (also called nested set model)</a></li>
</ul>
<p>In this post I will show you how to use the adjacency list model and how to implement it in PHP. Look at the picture to get a better idea about what the adjacency model looks like:</p>
<div id="attachment_628" class="wp-caption aligncenter" style="width: 587px"><a href="http://blog.richardknop.com/wp-content/uploads/2011/02/adjacency.jpg"><img class="size-full wp-image-628" title="Adjacency list model" src="http://blog.richardknop.com/wp-content/uploads/2011/02/adjacency.jpg" alt="" width="577" height="225" /></a><p class="wp-caption-text">Adjacency list model</p></div>
<p>As you can see the hierarchy is created by parent-child relationships. A typical example would be categories in WordPress where every category can have zero or one parent.</p>
<p>How is this achieved in the database? The table just need to have an additional column with the id of the parent. In addition, this column should allow NULL values. For instance:</p>
<pre>CREATE TABLE categories (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
parent_id INT NULL DEFAULT NULL,
FOREIGN KEY (parent_id) REFERENCES categories(id) ON UPDATE CASCADE,
INDEX (parent_id),
PRIMARY KEY (id)
) ENGINE = INNODB;</pre>
<p>Let&#8217;s populate the table with some content we can work with:</p>
<pre>INSERT INTO categories (id, name, parent_id) VALUES
(NULL, 'Relational databases', NULL),
(NULL, 'SQLite', 1),
(NULL, 'MySQL', 1),
(NULL, 'PostgreSQL', 1),
(NULL, 'PDO', 3),
(NULL, 'Transactions', 3);</pre>
<p>Adding, editing or removing categories from this table is easy. The query to select the full tree is more complex though:</p>
<pre>SELECT t0.id AS lvl0_id, t0.name AS lvl0_name,
t1.id AS lvl1_id, t1.name as lvl1_name,
t2.id AS lvl2_id, t2.name as lvl2_name,
t3.id AS lvl3_id, t3.name as lvl3_name,
t4.id AS lvl4_id, t4.name as lvl4_name
FROM categories AS t0
LEFT JOIN categories AS t1 ON t1.parent_id = t0.id
LEFT JOIN categories AS t2 ON t2.parent_id = t1.id
LEFT JOIN categories AS t3 ON t3.parent_id = t2.id
LEFT JOIN categories AS t4 ON t4.parent_id = t3.id
ORDER BY t0.id, t1.id, t2.id, t3.id, t4.id;</pre>
<h2>PHP implementation</h2>
<p>Now the intriguing part. You will usually want to display the tree in a nested unordered XHTML list. There are many ways to do it, here is my approach:</p>
<div class="geshi no php">
<div class="head">$user = &#39;root&#39;;</div>
<ol>
<li class="li1">
<div class="de1"><span class="re1">$pass</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$conn</span> <span class="sy0">=</span> <span class="kw2">new</span> PDO<span class="br0">&#40;</span><span class="st0">&#39;mysql:host=localhost;dbname=test&#39;</span><span class="sy0">,</span> <span class="re1">$user</span><span class="sy0">,</span> <span class="re1">$pass</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$sql</span> <span class="sy0">=</span><span class="st0">&#39;SELECT t0.id AS lvl0_id, t0.name AS lvl0_name,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">t1.id AS lvl1_id, t1.name as lvl1_name,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">t2.id AS lvl2_id, t2.name as lvl2_name,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">t3.id AS lvl3_id, t3.name as lvl3_name,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">t4.id AS lvl4_id, t4.name as lvl4_name</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">FROM categories AS t0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">LEFT JOIN categories AS t1 ON t1.parent_id = t0.id</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">LEFT JOIN categories AS t2 ON t2.parent_id = t1.id</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">LEFT JOIN categories AS t3 ON t3.parent_id = t2.id</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">LEFT JOIN categories AS t4 ON t4.parent_id = t3.id</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">ORDER BY t0.id, t1.id, t2.id, t3.id, t4.id&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$stmt</span> <span class="sy0">=</span> <span class="re1">$conn</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="re1">$sql</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$categories</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$pool</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span><span class="re1">$row</span> <span class="sy0">=</span> <span class="re1">$stmt</span><span class="sy0">-&gt;</span><span class="me1">fetchObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl0_id</span><span class="sy0">,</span> <span class="re1">$pool</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl0_name</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$c</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;id&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl0_id</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;name&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl0_name</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;level&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$c</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl1_id</span><span class="sy0">,</span> <span class="re1">$pool</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl1_name</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$c</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;id&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl1_id</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;name&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl1_name</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;level&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$c</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl2_id</span><span class="sy0">,</span> <span class="re1">$pool</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl2_name</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$c</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;id&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl2_id</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;name&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl2_name</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;level&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$c</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl3_id</span><span class="sy0">,</span> <span class="re1">$pool</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl3_name</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$c</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;id&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl3_id</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;name&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl3_name</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;level&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">3</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$c</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl4_id</span><span class="sy0">,</span> <span class="re1">$pool</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw2">false</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl4_name</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$c</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;id&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl4_id</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;name&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl4_name</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;level&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">4</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$categories</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$c</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$pool</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl0_id</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$pool</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl1_id</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$pool</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl2_id</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$pool</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl3_id</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$pool</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lvl4_id</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&#39;&lt;ul&gt;&#39;</span><span class="sy0">,</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$count</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re1">$categories</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$count</span> <span class="sy0">==</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#39;&lt;li&gt;&#39;</span><span class="sy0">,</span> <span class="re1">$categories</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;name&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="st0">&#39;&lt;/li&gt;&#39;</span><span class="sy0">,</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#39;&lt;li&gt;&#39;</span><span class="sy0">,</span> <span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;name&#39;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$i</span> <span class="sy0">&lt;</span> <span class="re1">$count</span> <span class="sy0">-</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span> <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;level&#39;</span><span class="br0">&#93;</span> <span class="sy0">&gt;</span> <span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;level&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#39;&lt;ul&gt;&#39;</span><span class="sy0">,</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#39;&lt;/li&gt;&#39;</span><span class="sy0">,</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span> <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;level&#39;</span><span class="br0">&#93;</span> <span class="sy0">&lt;</span> <span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;level&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="kw3">str_repeat</span><span class="br0">&#40;</span><span class="st0">&#39;&lt;/ul&gt;&lt;/li&gt;&#39;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;level&#39;</span><span class="br0">&#93;</span> <span class="sy0">-</span> <span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span> <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;level&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#39;&lt;li&gt;&#39;</span><span class="sy0">,</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="kw3">str_repeat</span><span class="br0">&#40;</span><span class="st0">&#39;&lt;/ul&gt;&lt;/li&gt;&#39;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">,</span> <span class="re1">$categories</span><span class="br0">&#91;</span><span class="re1">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;level&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$i</span><span class="sy0">++;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&#39;&lt;/ul&gt;&#39;</span><span class="sy0">,</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<h2>Disadvantages</h2>
<ul>
<li>limited hierarchy levels (not a big problem as you can easily modify the SQL query for any amount of levels)</li>
<li>complex and long-winded PHP implementation</li>
</ul>
<h2>Advantages</h2>
<ul>
<li>fast (you need only a single SQL query &#8211; much much faster than the usual recursion method)</li>
<li>very simple hierarchy modifications (you need to update only a single table row each time &#8211; not the whole table as in the nested set model)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.richardknop.com/2009/05/adjacency-list-model/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

