<?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"
	>

<channel>
	<title>anti.masendav.com</title>
	<atom:link href="http://anti.masendav.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://anti.masendav.com</link>
	<description>mostly PHP &#38; interesting links</description>
	<pubDate>Wed, 20 Aug 2008 04:03:55 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>links for 2008-08-19</title>
		<link>http://anti.masendav.com/2008/08/links-for-2008-08-19/</link>
		<comments>http://anti.masendav.com/2008/08/links-for-2008-08-19/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 04:03:55 +0000</pubDate>
		<dc:creator>lingid</dc:creator>
		
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/2008/08/links-for-2008-08-19/</guid>
		<description><![CDATA[

80sTees.com T-Shirts


99 Bottles of Beer &#124; Language Perl


]]></description>
			<content:encoded><![CDATA[<ul class="delicious">
<li>
<div class="delicious-link"><a href="http://search.80stees.com/?category=80s+Movies&amp;i=1&amp;q=&amp;theme=Chuck+Norris&amp;u1=category&amp;u2=theme">80sTees.com T-Shirts</a></div>
</li>
<li>
<div class="delicious-link"><a href="http://99-bottles-of-beer.net/language-perl-737.html">99 Bottles of Beer | Language Perl</a></div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/08/links-for-2008-08-19/feed/</wfw:commentRss>
		</item>
		<item>
		<title>links for 2008-07-12</title>
		<link>http://anti.masendav.com/2008/07/links-for-2008-07-12/</link>
		<comments>http://anti.masendav.com/2008/07/links-for-2008-07-12/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 23:31:59 +0000</pubDate>
		<dc:creator>lingid</dc:creator>
		
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/2008/07/links-for-2008-07-12/</guid>
		<description><![CDATA[

TED &#124; About TED &#124; TEDTalks


]]></description>
			<content:encoded><![CDATA[<ul class="delicious">
<li>
<div class="delicious-link"><a href="http://www.ted.com/index.php/talks/top10">TED | About TED | TEDTalks</a></div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/07/links-for-2008-07-12/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Walled off gardens</title>
		<link>http://anti.masendav.com/2008/07/walled-off-gardens/</link>
		<comments>http://anti.masendav.com/2008/07/walled-off-gardens/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 20:14:57 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/?p=107</guid>
		<description><![CDATA[I just finished testing a beta version of a VOD (Video-On-Demand) solution of my local Cable TV provider. In my mind an ideal Video-On-Demand solutions is the one where, when you happen to be bored and just want to watch a movie, you go and select something out of catalogue of tens of thousands of [...]]]></description>
			<content:encoded><![CDATA[<p>I just finished testing a beta version of a VOD (Video-On-Demand) solution of my local Cable TV provider. In my mind an ideal Video-On-Demand solutions is the one where, when you happen to be bored and just want to watch a movie, you go and select something out of catalogue of tens of thousands of movie and then start watching it right away. Preferrably without any ad interruptions. Now, I know that you guys in US have Netflix and other similar services, but we here in Estonia are not that lucky. There aren&#8217;t really that many options besides video rental stores (with barely any selection) and of course DVD stores (be it brick-and-mortar store or an online one). So, I had really high hopes for that particular VOD application, but sadly it turned out to be a major disappointment.</p>
<p>Firstly, there is barely any movie selection as of right now. But this really is not that much of a problem, because the whole thing is still in beta stadium and movies can be added very easily later on once the platform is mature enough. It is also slow, but that too is forgivable in a beta version of the app.</p>
<p>In my eyes the major mistake they did was - the UI. You&#8217;re expected to browse the catalogue and make selections from your TV using your remote. White at the first glance it does not seem that bad of an idea - it really does not work out. Imagine a catalogue of lets say 50.000 titles, you&#8217;re looking for something - the remote control however does not have a full keyboard, so the developers opted for an on-screen keyboard. One where a keyboard is shown on screen and you&#8217;re expected to move around with arrow keys and select letters one by one. Of course, it is pretty much the only solution when your input device is a TV remote. But it also is seriously cumbersome. Then combine that kind of UI with navigating back and forth inside search results. And once you make a selection and &#8220;rent&#8221; the movie you have to start over beginning. But I want to have much more than that. I want to bookmark search results, I want to see recommendations from my friends, I want to see newly added movies in my RSS reader and I really can&#8217;t do any of that. By now it should be obvious what I&#8217;m aiming at here.</p>
<p>The biggest mistake is that the authors of that particular app built their own walled off garden for themselves. A completely new application, inside a seriously limited environment (TV + remote), an enviroment, that was never designed for jobs like this.  All UI and UI elements have to be invented again there are no comfortable ways to control the UI and precisely because of that this thing will never work out well.</p>
<p>They are not the first ones either, there are numerous examples throughout the history. Why, again, do people keep making the same mistake over and over again?</p>
<p>Let me describe the ideal (or at least 100x times better) VOD solution. It would be a web application, the whole catalogue should be browseable online, I could read reviews inside both the catalogue and external sites, create favourites lists, get updates on new titles through an RSS reader and really to all those fun things that are possible inside the web application.</p>
<p>Then, after making the choice of what I want to see, I could pay for it right away. With my credit card or bank transfer (the latter works really well here in Estonia, it&#8217;s virtually instant and very secure) and only the last step of the VOD application should be inside my TV - the one where I can see my currently &#8220;rented&#8221; movies and view them. Everything else should be built as a web application. The web app could also be linked to an online DVD store, so for example if I happen to really like a particular movie or show I could order it on DVD with just a few clicks. The possibilites are endless.</p>
<p>And yet  people choose the path of walling themselves off from the world wide web.</p>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/07/walled-off-gardens/feed/</wfw:commentRss>
		</item>
		<item>
		<title>links for 2008-06-24</title>
		<link>http://anti.masendav.com/2008/06/links-for-2008-06-24/</link>
		<comments>http://anti.masendav.com/2008/06/links-for-2008-06-24/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 23:37:01 +0000</pubDate>
		<dc:creator>lingid</dc:creator>
		
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/2008/06/links-for-2008-06-24/</guid>
		<description><![CDATA[

Python Cookbook, 2nd Edition - Python Cookbook, 2nd Edition


]]></description>
			<content:encoded><![CDATA[<ul class="delicious">
<li>
<div class="delicious-link"><a href="http://www.ubookcase.com/book/Oreilly/Python.Cookbook.2nd.edition/">Python Cookbook, 2nd Edition - Python Cookbook, 2nd Edition</a></div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/06/links-for-2008-06-24/feed/</wfw:commentRss>
		</item>
		<item>
		<title>links for 2008-06-22</title>
		<link>http://anti.masendav.com/2008/06/links-for-2008-06-22/</link>
		<comments>http://anti.masendav.com/2008/06/links-for-2008-06-22/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 23:35:48 +0000</pubDate>
		<dc:creator>lingid</dc:creator>
		
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/2008/06/links-for-2008-06-22/</guid>
		<description><![CDATA[

TopatoCo: Overcompensating and Wigu Store!


]]></description>
			<content:encoded><![CDATA[<ul class="delicious">
<li>
<div class="delicious-link"><a href="http://www.topatoco.com/merchant.mvc?Screen=CTGY&amp;Store_Code=TO&amp;Category_Code=WIGU">TopatoCo: Overcompensating and Wigu Store!</a></div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/06/links-for-2008-06-22/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Eating habits of developers</title>
		<link>http://anti.masendav.com/2008/06/eating-habits-of-developers/</link>
		<comments>http://anti.masendav.com/2008/06/eating-habits-of-developers/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 10:37:07 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[fun]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/?p=104</guid>
		<description><![CDATA[This one started out as an internal joke, but it has become quite generic  

Java developers always go to eat together, in pairs, hand in hand, well organized (synchronized)
PHP devs go at random times, some of them run, some walk, some take the elevator. (loose coding style)
DB devs choose someone, who will then go [...]]]></description>
			<content:encoded><![CDATA[<p>This one started out as an internal joke, but it has become quite generic <img src='http://anti.masendav.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li>Java developers always go to eat together, in pairs, hand in hand, well organized (synchronized)</li>
<li>PHP devs go at random times, some of them run, some walk, some take the elevator. (loose coding style)</li>
<li>DB devs choose someone, who will then go to kitchen and fetch the food for everyone (also known as proxy)</li>
<li>Delphi devs get the plate, put it in the center of kitchen, then get a fork and then walk between the food containers and plate, until plate is filled (drag &#8216;n drop)</li>
<li>C devs kill their own animals and eat them raw (low-level)</li>
<li>C++ devs prepare their food from prefabricated components in microwave oven (not that low-level)</li>
<li>Frontend (HTML) devs decorate their food with cucumbers, tomatoes and generally everything else in the fridge and then play around with it until the food is cold</li>
<li>Python devs always take the stairs (mandatory stepping) (from Jaagup Irve)</li>
<li>Perl devs bring their own food to the work and eat it alone in the corner, while everybody else is giving them weird glances (You call THAT food? eewwwww) (syntax)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/06/eating-habits-of-developers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Scanning files for a specific string</title>
		<link>http://anti.masendav.com/2008/06/scanning-files-for-a-specific-string/</link>
		<comments>http://anti.masendav.com/2008/06/scanning-files-for-a-specific-string/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 17:21:43 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[iterator]]></category>

		<category><![CDATA[spl]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/?p=103</guid>
		<description><![CDATA[Over at DevNetwork forums somebody asked for a piece of code, that scans a directory containing thousands of files for a file containg specific string.
Here is the solution I came up with it:



&#60; ?php


// list file extensions that you care about here


$extensions = array&#40;&#39;php&#39;,&#39;inc&#39;&#41;;


&#160;


foreach&#40;new RecursiveIteratorIterator&#40;new RecursiveDirectoryIterator&#40;&#39;.&#39;&#41;&#41; as $Item&#41;


&#123;


&#160; &#160; if &#40;$Item-&#62;isFile&#40;&#41; and in_array&#40;pathinfo&#40;$Item-&#62;getFilename&#40;&#41;,PATHINFO_EXTENSION&#41;,$extensions&#41;&#41;


&#160; &#160; &#123;


&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Over at <a href="http://forums.devnetwork.net/viewtopic.php?f=1&#038;t=83995&#038;p=466328">DevNetwork forums</a> somebody asked for a piece of code, that scans a directory containing thousands of files for a file containg specific string.</p>
<p>Here is the solution I came up with it:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span> ?php</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// list file extensions that you care about here</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$extensions</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;php&#39;</span><span class="sy0">,</span><span class="st0">&#39;inc&#39;</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="kw1">foreach</span><span class="br0">&#40;</span><span class="kw2">new</span> RecursiveIteratorIterator<span class="br0">&#40;</span><span class="kw2">new</span> RecursiveDirectoryIterator<span class="br0">&#40;</span><span class="st0">&#39;.&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re1">$Item</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><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="re1">$Item</span><span class="sy0">-&gt;</span><span class="me1">isFile</span><span class="br0">&#40;</span><span class="br0">&#41;</span> and <span class="kw3">in_array</span><span class="br0">&#40;</span><span class="kw3">pathinfo</span><span class="br0">&#40;</span><span class="re1">$Item</span><span class="sy0">-&gt;</span><span class="me1">getFilename</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span>PATHINFO_EXTENSION<span class="br0">&#41;</span><span class="sy0">,</span><span class="re1">$extensions</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$Item</span><span class="sy0">-&gt;</span><span class="me1">openFile</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re1">$linenum</span> <span class="sy0">=&gt;</span> <span class="re1">$line</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// add the code to check your pattern here</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>stripos<span class="br0">&#40;</span><span class="re1">$line</span><span class="sy0">,</span><span class="st0">&#39;class&#39;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</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="re1">$Item</span><span class="sy0">-&gt;</span><span class="me1">getPathname</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st0">&#39;:&#39;</span><span class="sy0">,</span> <span class="re1">$linenum</span><span class="sy0">,</span> <span class="st0">&#39; &#39;</span><span class="sy0">,</span> <span class="re1">$line</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></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>
</ol>
</div>
<p><strong>Upside:</strong> it scans the directory structure recursively and the code is quite clean, besides maybe the pathinfo call to filter out filenames with specific extension.</p>
<p><strong>Downside:</strong> it&#8217;s slow. In real life grep or some other tool is used for task like this.</p>
<p>Still, the code shows the power of SPL File- &#038; DirectoryIterators nicely.</p>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/06/scanning-files-for-a-specific-string/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Grouping array contents</title>
		<link>http://anti.masendav.com/2008/06/grouping-array-contents/</link>
		<comments>http://anti.masendav.com/2008/06/grouping-array-contents/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 14:02:55 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/?p=102</guid>
		<description><![CDATA[Source data:



$triples = array&#40;&#41;;


$triples&#91;&#93; = array&#40;&#39;VISA&#39;,&#39;EUR&#39;,13&#41;;


$triples&#91;&#93; = array&#40;&#39;VISA&#39;,&#39;EUR&#39;,26&#41;;


$triples&#91;&#93; = array&#40;&#39;VISA&#39;,&#39;EUR&#39;,39&#41;;


$triples&#91;&#93; = array&#40;&#39;VISA&#39;,&#39;JPY&#39;,13&#41;;


$triples&#91;&#93; = array&#40;&#39;PAYPAL&#39;,&#39;JPY&#39;,13&#41;;



Desired result



array&#40;


&#160; &#160; array&#40;&#39;VISA&#39;,&#39;EUR&#39;,78&#41;,


&#160; &#160; array&#40;&#39;VISA&#39;,&#39;JPY&#39;,13&#41;,


&#160; &#160; array&#40;&#39;PAYPAL&#39;,&#39;JPY&#39;,13&#41;


&#41;



e.g. group data by both payment method and currency.
My solution



$triples = array&#40;&#41;;


$triples&#91;&#93; = array&#40;&#39;VISA&#39;,&#39;EUR&#39;,13&#41;;


$triples&#91;&#93; = array&#40;&#39;VISA&#39;,&#39;EUR&#39;,26&#41;;


$triples&#91;&#93; = array&#40;&#39;VISA&#39;,&#39;EUR&#39;,39&#41;;


$triples&#91;&#93; = array&#40;&#39;VISA&#39;,&#39;JPY&#39;,13&#41;;


$triples&#91;&#93; = array&#40;&#39;PAYPAL&#39;,&#39;JPY&#39;,13&#41;;


&#160;


&#160;


$result = array&#40;&#41;;


foreach&#40;$triples as $key =&#62; $value&#41;


&#123;


&#160; &#160; $lookup_key = $value&#91;0&#93; . &#39;-&#39; . [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Source data:</strong></p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$triples</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">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;EUR&#39;</span><span class="sy0">,</span><span class="nu0">13</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;EUR&#39;</span><span class="sy0">,</span><span class="nu0">26</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;EUR&#39;</span><span class="sy0">,</span><span class="nu0">39</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;JPY&#39;</span><span class="sy0">,</span><span class="nu0">13</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;PAYPAL&#39;</span><span class="sy0">,</span><span class="st0">&#39;JPY&#39;</span><span class="sy0">,</span><span class="nu0">13</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p><strong>Desired result</strong></p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;EUR&#39;</span><span class="sy0">,</span><span class="nu0">78</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;JPY&#39;</span><span class="sy0">,</span><span class="nu0">13</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;PAYPAL&#39;</span><span class="sy0">,</span><span class="st0">&#39;JPY&#39;</span><span class="sy0">,</span><span class="nu0">13</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>e.g. group data by both payment method and currency.<br />
<strong>My solution</strong></p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$triples</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">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;EUR&#39;</span><span class="sy0">,</span><span class="nu0">13</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;EUR&#39;</span><span class="sy0">,</span><span class="nu0">26</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;EUR&#39;</span><span class="sy0">,</span><span class="nu0">39</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;VISA&#39;</span><span class="sy0">,</span><span class="st0">&#39;JPY&#39;</span><span class="sy0">,</span><span class="nu0">13</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$triples</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;PAYPAL&#39;</span><span class="sy0">,</span><span class="st0">&#39;JPY&#39;</span><span class="sy0">,</span><span class="nu0">13</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">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$result</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">foreach</span><span class="br0">&#40;</span><span class="re1">$triples</span> <span class="kw1">as</span> <span class="re1">$key</span> <span class="sy0">=&gt;</span> <span class="re1">$value</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$lookup_key</span> <span class="sy0">=</span> <span class="re1">$value</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="st0">&#39;-&#39;</span> <span class="sy0">.</span> <span class="re1">$value</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">array_key_exists</span><span class="br0">&#40;</span><span class="re1">$lookup_key</span><span class="sy0">,</span> <span class="re1">$result</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">$result</span><span class="br0">&#91;</span><span class="re1">$lookup_key</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> <span class="sy0">+=</span> <span class="re1">$value</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&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; <span class="re1">$result</span><span class="br0">&#91;</span><span class="re1">$lookup_key</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re1">$value</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">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re1">$result</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Downside - data is accessed by numberic key, which is generally not a good thing to do. This however is just a proof of concept, in real life you probably have names for your columns.</p>
<p>Can you write a shorter and more elegant solution?</p>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/06/grouping-array-contents/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Searching file contents with Iterators</title>
		<link>http://anti.masendav.com/2008/06/searching-file-contents-with-iterators/</link>
		<comments>http://anti.masendav.com/2008/06/searching-file-contents-with-iterators/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 09:12:13 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[iterator]]></category>

		<category><![CDATA[spl]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/?p=101</guid>
		<description><![CDATA[


// the following code returns all lines of source.txt that contain the string Aerosmith. 


// Feel free to extend it for your own uses


class FileGrep extends FilterIterator


&#123;


&#160; &#160; private $needle;


&#160;


&#160; &#160; public function __construct&#40;$file, $needle&#41; &#123;


&#160; &#160; &#160; &#160; parent::__construct&#40;new SplFileObject&#40;$file&#41;&#41;;


&#160; &#160; &#160; &#160; $this-&#62;needle = $needle;


&#160; &#160; &#125;


&#160;


&#160; &#160; public function accept&#40;&#41; 


&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// the following code returns all lines of source.txt that contain the string Aerosmith. </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Feel free to extend it for your own uses</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> FileGrep <span class="kw2">extends</span> FilterIterator</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="re1">$needle</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re1">$file</span><span class="sy0">,</span> <span class="re1">$needle</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; parent<span class="sy0">::</span>__construct<span class="br0">&#40;</span><span class="kw2">new</span> SplFileObject<span class="br0">&#40;</span><span class="re1">$file</span><span class="br0">&#41;</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">$this</span><span class="sy0">-&gt;</span><span class="me1">needle</span> <span class="sy0">=</span> <span class="re1">$needle</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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> accept<span class="br0">&#40;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</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="kw3">strpos</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">current</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">needle</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</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">return</span> <span class="kw2">true</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="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</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="kw1">foreach</span><span class="br0">&#40;</span><span class="kw2">new</span> FileGrep<span class="br0">&#40;</span><span class="st0">&#39;source.txt&#39;</span><span class="sy0">,</span><span class="st0">&#39;Aerosmith&#39;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re1">$line</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">print</span> <span class="re1">$line</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/06/searching-file-contents-with-iterators/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SimpleXMLIterator &#038; FilterIterator combined</title>
		<link>http://anti.masendav.com/2008/06/simplexmliterator-filteriterator-combined/</link>
		<comments>http://anti.masendav.com/2008/06/simplexmliterator-filteriterator-combined/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 20:55:30 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[iterator]]></category>

		<category><![CDATA[spl]]></category>

		<guid isPermaLink="false">http://anti.masendav.com/?p=100</guid>
		<description><![CDATA[


&#60; ?php


/*


&#160; &#160; Goal:


&#160; &#160; &#160; * Take a GPX (which is XML) file


&#160; &#160; &#160; * Extract interesting records from it


&#160; &#160; &#160; * Calculate the arithmetic average of latitudes and longitutes


&#160; &#160; &#160; 


&#160; &#160; I won&#39;t tell you why exactly I needed this, just that it is part of a game


&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span> ?php</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; Goal:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; * Take a GPX (which is XML) file</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; * Extract interesting records from it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; * Calculate the arithmetic average of latitudes and longitutes</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; I won&#39;t tell you why exactly I needed this, just that it is part of a game</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; called geocaching</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &#8212;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; Class is called collector, because I am _collecting_ only the records</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; I&#39;m interested in</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; Example record:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &lt;wpt lat=&quot;59.4658317566&quot; lon=&quot;24.8649997711&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;name&gt;&lt; ![CDATA[Gtehnokratt]]&gt;&lt;/name&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;url&gt;&lt; ![CDATA[http://www.geopeitus.ee/?p=350&amp;c=2]]&gt;&lt;/url&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; Actually there is more data, but I&#39;m only interested in lat and lon attributes</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; and name and url elements.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; Records do not have any id-s, only the url has the unique identifier at the end.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Collector <span class="kw2">extends</span> FilterIterator</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* I only care about records with id&#39;s that are listed here</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="re1">$ids</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">187</span><span class="sy0">,</span> <span class="nu0">513</span><span class="sy0">,</span> <span class="nu0">537</span><span class="sy0">,</span> <span class="nu0">542</span><span class="sy0">,</span> <span class="nu0">544</span><span class="sy0">,</span> <span class="nu0">563</span><span class="sy0">,</span> <span class="nu0">605</span><span class="sy0">,</span> <span class="nu0">715</span><span class="sy0">,</span> <span class="nu0">717</span><span class="sy0">,</span> <span class="nu0">748</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">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Set up the FilterIterator by passing our SimpleXMLIterator to it</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span>Iterator <span class="re1">$it</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; parent<span class="sy0">::</span>__construct<span class="br0">&#40;</span><span class="re1">$it</span><span class="br0">&#41;</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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Part of FilterIterator implementation, called for each record,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* responsible for the decision whether the current element is needed</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* or not</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> accept<span class="br0">&#40;</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">$id</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">get_id_from_url</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">current</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</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="kw3">in_array</span><span class="br0">&#40;</span><span class="re1">$id</span><span class="sy0">,</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">ids</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; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</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; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</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; &nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Extracts record ID from string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> get_id_from_url<span class="br0">&#40;</span><span class="re1">$url</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// http://www.geopeitus.ee/?p=350&amp;c=514</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">preg_match</span><span class="br0">&#40;</span><span class="st0">&#39;/&amp;c=(<span class="es0">\d</span>+)$/&#39;</span><span class="sy0">,</span><span class="re1">$url</span><span class="sy0">,</span><span class="re1">$matches</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$matches</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</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">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; SimpleXMLIterator is one of the standard SPL iterators, which makes it possible</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; to use other standard iterators when parsing XML</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; Second argument of simplexml_load_file is a class name and as result the XML</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; in-memory representation becomes instance of that class. Seems awkward, but</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; really useful</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$it</span> <span class="sy0">=</span> simplexml_load_file<span class="br0">&#40;</span><span class="st0">&#39;geopeitusee.gpx&#39;</span><span class="sy0">,</span><span class="st0">&#39;SimpleXMLIterator&#39;</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">$lat_sum</span> <span class="sy0">=</span> <span class="re1">$lon_sum</span> <span class="sy0">=</span> <span class="re1">$count</span> <span class="sy0">=</span> <span class="nu0">0.0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// so, all the data goes in, but only the elements I&#39;m interested in, come out</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span><span class="br0">&#40;</span><span class="kw2">new</span> Collector<span class="br0">&#40;</span><span class="re1">$it</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re1">$element</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// access subnodes with $element-&gt;name</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// access attributes with array notation</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;taking %s, lat=%f, lon = %f<span class="es0">\n</span>&quot;</span><span class="sy0">,</span> <span class="re1">$element</span><span class="sy0">-&gt;</span><span class="me1">name</span><span class="sy0">,</span><span class="re1">$element</span><span class="br0">&#91;</span><span class="st0">&#39;lat&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="re1">$element</span><span class="br0">&#91;</span><span class="st0">&#39;lon&#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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// typecasting is needed to get correct results from SimpleXML, otherwise you would</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// get integers</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$lat_sum</span> <span class="sy0">+=</span> <span class="br0">&#40;</span>float<span class="br0">&#41;</span><span class="re1">$element</span><span class="br0">&#91;</span><span class="st0">&#39;lat&#39;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$lon_sum</span> <span class="sy0">+=</span> <span class="br0">&#40;</span>float<span class="br0">&#41;</span><span class="re1">$element</span><span class="br0">&#91;</span><span class="st0">&#39;lon&#39;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re1">$count</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="co1">// finally do the math</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Average: cnt=%d lat=%s, lon=%s<span class="es0">\n</span>&quot;</span><span class="sy0">,</span> <span class="re1">$count</span><span class="sy0">,</span> <span class="br0">&#40;</span><span class="re1">$lat_sum</span> <span class="sy0">/</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re1">$lon_sum</span> <span class="sy0">/</span> <span class="re1">$count</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://anti.masendav.com/2008/06/simplexmliterator-filteriterator-combined/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.460 seconds -->
