<?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>the fancy part of the web &#187; spl</title>
	<atom:link href="http://blog.tolleiv.de/tag/spl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tolleiv.de</link>
	<description>is elsewhere - this is just about all sorts of web related work with a small factor of fanciness</description>
	<lastBuildDate>Sat, 21 Jan 2012 12:58:05 +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>Iterator [GoF]</title>
		<link>http://blog.tolleiv.de/2008/07/iterator-gof/</link>
		<comments>http://blog.tolleiv.de/2008/07/iterator-gof/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 17:30:00 +0000</pubDate>
		<dc:creator>tolleiv</dc:creator>
				<category><![CDATA[behavioral]]></category>
		<category><![CDATA[iterator]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[spl]]></category>

		<guid isPermaLink="false">http://blog.tolleiv.de/2008/07/iterator-gof/</guid>
		<description><![CDATA[Lot's of people like to write down things into lists, so that they can go through that list later and check whether everything was fine. Normally every recipe has a list ~ there's always a list of ingredients at the beginning of the recipe.
This short example shows how such a list can be processed ...]]></description>
			<content:encoded><![CDATA[<p>Lot&#8217;s of people like to write down things into lists, so that they can go through that list later and check whether everything was fine. Normally every recipe has a list ~ there&#8217;s always a list of ingredients at the beginning of the recipe.<br />
This short example shows how such a list can be processed in PHP. So why would you want to have something else than a array to hold your objects? &#8211; My example still uses a array to hold the objects (uni- or bidirectional lists would also be possible) but it adds a kind of a facade to the array so that the common managements-tasks are handled within the List-Object. Everything you need for this example is present in PHP since version 5.0. The basic steps you need to do is to provide a <span style="font-style: italic;">&#8220;Object&#8221;</span> and an <span style="font-style: italic;">&#8220;ObjectList&#8221; </span>which implements the native <a href="http://www.php.net/manual/en/language.oop5.iterations.php"><span style="font-style: italic;">&#8220;Iterator&#8221;</span></a> interface and then you&#8217;re able to have very handy lists <img src='http://blog.tolleiv.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<a onclick="document.getElementById('codeblockIt1').style.display=((document.getElementById('codeblockIt1').style.display=='block')?'none':'block');" href="#codeIt1"></a></p>
<div id="codeblockIt1" class="code">
<p><span style="color: #007700;">class </span><span style="color: #0000bb;">Incredient </span><span style="color: #007700;">{</span></p>
<p>public <span style="color: #0000bb;">$name</span><span style="color: #007700;">,</span><span style="color: #0000bb;">$amount</span><span style="color: #007700;">;<br />
public function </span><span style="color: #0000bb;">__construct</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$name</span><span style="color: #007700;">,</span><span style="color: #0000bb;">$amount</span><span style="color: #007700;">) {<br />
</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">name </span><span style="color: #007700;">= </span><span style="color: #0000bb;">$name</span><span style="color: #007700;">;<br />
</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">amount </span><span style="color: #007700;">= </span><span style="color: #0000bb;">$amount</span><span style="color: #007700;">;<br />
}<br />
}</span></p>
<p>class <span style="color: #0000bb;">Recipe </span><span style="color: #007700;">implements </span><span style="color: #0000bb;">Iterator </span><span style="color: #007700;">{<br />
public </span><span style="color: #0000bb;">$title</span><span style="color: #007700;">;<br />
private </span><span style="color: #0000bb;">$ingredients</span><span style="color: #007700;">;</span></p>
<p>public function <span style="color: #0000bb;">__construct </span><span style="color: #007700;">(</span><span style="color: #0000bb;">$title</span><span style="color: #007700;">) {<br />
</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">title </span><span style="color: #007700;">= </span><span style="color: #0000bb;">$title</span><span style="color: #007700;">;<br />
}</span></p>
<p>public function <span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(</span><span style="color: #0000bb;">Incredient $in</span><span style="color: #007700;">) {<br />
</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">ingredients</span><span style="color: #007700;">[] = </span><span style="color: #0000bb;">$in</span><span style="color: #007700;">;<br />
}</span></p>
<p>public function <span style="color: #0000bb;">current </span><span style="color: #007700;">()  {   return </span><span style="color: #0000bb;">current </span><span style="color: #007700;">(</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">ingredients</span><span style="color: #007700;">);    }<br />
public function </span><span style="color: #0000bb;">key </span><span style="color: #007700;">()      {   return </span><span style="color: #0000bb;">key</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">ingredients</span><span style="color: #007700;">);         }<br />
public function </span><span style="color: #0000bb;">valid </span><span style="color: #007700;">()    {   return </span><span style="color: #0000bb;">current </span><span style="color: #007700;">(</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">ingredients</span><span style="color: #007700;">);    }<br />
public function </span><span style="color: #0000bb;">rewind </span><span style="color: #007700;">()   {   return </span><span style="color: #0000bb;">reset </span><span style="color: #007700;">(</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">ingredients</span><span style="color: #007700;">);      }<br />
public function </span><span style="color: #0000bb;">next </span><span style="color: #007700;">()     {   return </span><span style="color: #0000bb;">next </span><span style="color: #007700;">(</span><span style="color: #0000bb;">$this</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">ingredients</span><span style="color: #007700;">);       }<br />
}</span></p>
<p><!-- Code end --></p>
</div>
<div id="codeblockIt2" class="code" style="display: block;">
<p><span style="color: #0000bb;">$cookieRecipe </span><span style="color: #007700;">= new </span><span style="color: #0000bb;">Recipe</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8220;Chocolate Cookie&#8221;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Flour&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;2.5 cups&#8217;</span><span style="color: #007700;">));<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Baking soda&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1 teaspoon&#8217;</span><span style="color: #007700;">));<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Salt&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;0.5 teaspoon&#8217;</span><span style="color: #007700;">));<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Butter&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1 cup&#8217;</span><span style="color: #007700;">));<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Sugar&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1 cup&#8217;</span><span style="color: #007700;">));<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Brown Sugar&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;0.5 cup&#8217;</span><span style="color: #007700;">));<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Vanilla extract&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1 teaspoon&#8217;</span><span style="color: #007700;">));<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Egg&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1-2&#8242;</span><span style="color: #007700;">));<br />
</span><span style="color: #0000bb;">$cookieRecipe</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">addIncredient</span><span style="color: #007700;">(new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Chocolate chips&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;2 cups&#8217;</span><span style="color: #007700;">));</span></p>
<p><span style="color: #ff8000;">// process recipe:<br />
</span><span style="color: #007700;">foreach(</span><span style="color: #0000bb;">$cookieRecipe </span><span style="color: #007700;">as </span><span style="color: #0000bb;">$inc</span><span style="color: #007700;">) {<br />
echo </span><span style="color: #0000bb;">$inc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">name</span><span style="color: #007700;">.</span><span style="color: #dd0000;">&#8220; =&gt; &#8221;</span><span style="color: #007700;">.</span><span style="color: #0000bb;">$inc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">amount</span><span style="color: #007700;">.</span><span style="color: #dd0000;">&#8220;&lt;br/&gt;&#8221;</span><span style="color: #007700;">;<br />
}</span></p>
</div>
<p>As you see it&#8217;s pretty easy to have lists of objects in PHP. You might also think that always creating to some list-object over and over again is very odd and you&#8217;re right. For the most common tasks like <a href="http://www.php.net/manual/en/class.arrayiterator.php">iterating through arrays</a>, <a href="http://www.php.net/manual/en/class.directoryiterator.php">directory-lists</a> and a few more task you can use objects which are shipped with the Standard PHP Library ,which is also part of PHP since version 5 and mandatory in 5.3. So the example shown above could also look like this:</p>
<div id="codeblockIt3" class="code" style="display: block;">
<p><span style="color: #0000bb;">$recipe </span><span style="color: #007700;">= array();<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Flour&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;2.5 cups&#8217;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Baking soda&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1 teaspoon&#8217;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Salt&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;0.5 teaspoon&#8217;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Butter&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1 cup&#8217;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Sugar&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1 cup&#8217;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Brown Sugar&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;0.5 cup&#8217;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Vanilla extract&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1 teaspoon&#8217;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Egg&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;1-2&#8242;</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">[] = new </span><span style="color: #0000bb;">Incredient</span><span style="color: #007700;">(</span><span style="color: #dd0000;">&#8216;Chocolate chips&#8217;</span><span style="color: #007700;">,</span><span style="color: #dd0000;">&#8217;2 cups&#8217;</span><span style="color: #007700;">);</span></p>
<p><span style="color: #0000bb;">$recipeIncObj </span><span style="color: #007700;">= new </span><span style="color: #0000bb;">ArrayObject</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$recipe</span><span style="color: #007700;">);<br />
</span><span style="color: #0000bb;">$ingredientsIt </span><span style="color: #007700;">= </span><span style="color: #0000bb;">$recipeIncObj</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">getIterator</span><span style="color: #007700;">(); </span></p>
<p>foreach(<span style="color: #0000bb;">$ingredientsIt </span><span style="color: #007700;">as </span><span style="color: #0000bb;">$inc</span><span style="color: #007700;">) {<br />
echo </span><span style="color: #0000bb;">$inc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">name</span><span style="color: #007700;">.</span><span style="color: #dd0000;">&#8220; =&gt; &#8221;</span><span style="color: #007700;">.</span><span style="color: #0000bb;">$inc</span><span style="color: #007700;">-&gt;</span><span style="color: #0000bb;">amount</span><span style="color: #007700;">.</span><span style="color: #dd0000;">&#8220;&lt;br/&gt;&#8221;</span><span style="color: #007700;">;<br />
} </span></p>
</div>
<p>As I said at the beginning, there are lots of situations where you might want to have a list for something and if you store that list in PHP the Iterator-pattern can keep your code clean and tasty <img src='http://blog.tolleiv.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.tolleiv.de/?flattrss_redirect&amp;id=585&amp;md5=1dde71e3068f7f29863578a1a14f9ca9" title="Flattr" target="_blank"><img src="http://blog.tolleiv.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tolleiv.de/2008/07/iterator-gof/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

