<?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>project-2501.net &#187; php</title>
	<atom:link href="http://project-2501.net/index.php/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://project-2501.net</link>
	<description>The net is vast and infinite.</description>
	<lastBuildDate>Wed, 03 Feb 2010 08:51:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>total mysql rows</title>
		<link>http://project-2501.net/index.php/2009/09/total-mysql-rows/</link>
		<comments>http://project-2501.net/index.php/2009/09/total-mysql-rows/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 01:50:04 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=213</guid>
		<description><![CDATA[Turns out our Mysql server at work is a little bigger than I thought:
Databases 75
Tables &#160; &#160;1,549
Rows &#160; &#160; &#160;1,018,085,348
However over the last couple of months, we&#8217;ve only averaged 130 queries/second
Hacked up PHP to gather stats:
class MysqlCounter
&#123;
&#160; &#160; public function __construct&#40;$host, $username, $password&#41;
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; $this-&#62;conn = mysql_connect&#40;$host, $username, $password, true&#41;;
&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Turns out our Mysql server at work is a little bigger than I thought:</p>
<div class="codecolorer-container text " style="overflow:auto;white-space:nowrap;width:540px"><div class="text codecolorer" style="font-family:Monaco,Lucida Console,monospace">Databases 75<br />
Tables &nbsp; &nbsp;1,549<br />
Rows &nbsp; &nbsp; &nbsp;1,018,085,348</div></div>
<p>However over the last couple of months, we&#8217;ve only averaged 130 queries/second</p>
<p><strong>Hacked up PHP to gather stats:</strong></p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">class</span> MysqlCounter<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$host</span><span class="sy0">,</span> <span class="re0">$username</span><span class="sy0">,</span> <span class="re0">$password</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conn</span> <span class="sy0">=</span> <span class="kw3">mysql_connect</span><span class="br0">&#40;</span><span class="re0">$host</span><span class="sy0">,</span> <span class="re0">$username</span><span class="sy0">,</span> <span class="re0">$password</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conn</span> <span class="sy0">===</span> <span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;Unable to connect to Mysql server: &quot;</span> <span class="sy0">.</span> <span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_databases</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_tables</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_rows</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> query<span class="br0">&#40;</span><span class="re0">$sql</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> <span class="sy0">=</span> <span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="re0">$sql</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conn</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$query</span> <span class="sy0">===</span> <span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;Unable to run query: <span class="es4">$sql</span><span class="es1">\n</span>&quot;</span> <span class="sy0">.</span> <span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conn</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$query</span> <span class="sy0">===</span> <span class="kw2">true</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$rows</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="re0">$row</span> <span class="sy0">=</span> <span class="kw3">mysql_fetch_array</span><span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$rows</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$row</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$rows</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> gather_stats<span class="br0">&#40;</span><span class="re0">$callback</span> <span class="sy0">=</span> <span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SHOW DATABASES&quot;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$row_database</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_databases</span><span class="sy0">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;USE `<span class="es4">{$row_database['Database']}</span>`&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&quot;SHOW TABLE STATUS&quot;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$row_table</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_tables</span><span class="sy0">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">num_rows</span> <span class="sy0">+=</span> <span class="re0">$row_table</span><span class="br0">&#91;</span><span class="st_h">'Rows'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$callback</span> <span class="sy0">!==</span> <span class="kw2">false</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$args</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$row_database</span><span class="br0">&#91;</span><span class="st_h">'Database'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$row_table</span><span class="br0">&#91;</span><span class="st_h">'Name'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$row_table</span><span class="br0">&#91;</span><span class="st_h">'Rows'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">call_user_func_array</span><span class="br0">&#40;</span><span class="re0">$callback</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw3">static</span> <span class="kw2">function</span> default_callback<span class="br0">&#40;</span><span class="re0">$database</span><span class="sy0">,</span> <span class="re0">$table</span><span class="sy0">,</span> <span class="re0">$rows</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es6">%s</span> <span class="es6">%s</span> <span class="es6">%d</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$database</span><span class="sy0">,</span> <span class="re0">$table</span><span class="sy0">,</span> <span class="re0">$rows</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">$counter</span> <span class="sy0">=</span> <span class="kw2">new</span> MysqlCounter<span class="br0">&#40;</span><span class="st_h">'hostname'</span><span class="sy0">,</span> <span class="st_h">'username'</span><span class="sy0">,</span> <span class="st_h">'password'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$counter</span><span class="sy0">-&gt;</span><span class="me1">gather_stats</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'MysqlCounter'</span><span class="sy0">,</span> <span class="st_h">'default_callback'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
<span class="kw3">echo</span> <span class="st0">&quot;Databases <span class="es4">{$counter-&gt;num_databases}</span><span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;Tables &nbsp; &nbsp;<span class="es4">{$counter-&gt;num_tables}</span><span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;Rows &nbsp; &nbsp; &nbsp;<span class="es4">{$counter-&gt;num_rows}</span><span class="es1">\n</span>&quot;</span><span class="sy0">;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2009/09/total-mysql-rows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>i hate working with dates</title>
		<link>http://project-2501.net/index.php/2008/08/i-hate-working-with-dates/</link>
		<comments>http://project-2501.net/index.php/2008/08/i-hate-working-with-dates/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 01:45:10 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=85</guid>
		<description><![CDATA[This little snippet gets all the days in a month, and groups them by week.
&#60;?php

&#160; &#160; error_reporting&#40;E_ALL&#41;;

&#160; &#160; // Return an array of all the days in a month grouped by week number
&#160; &#160; // (Sunday is considered to be the first day of the week)
&#160; &#160; function weeksInMonth&#40;$month, $year&#41;
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>This little snippet gets all the days in a month, and groups them by week.</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">error_reporting</span><span class="br0">&#40;</span><span class="kw2">E_ALL</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Return an array of all the days in a month grouped by week number</span><br />
&nbsp; &nbsp; <span class="co1">// (Sunday is considered to be the first day of the week)</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> weeksInMonth<span class="br0">&#40;</span><span class="re0">$month</span><span class="sy0">,</span> <span class="re0">$year</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$firstDay</span> &nbsp; &nbsp;<span class="sy0">=</span> <span class="kw3">mktime</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="re0">$month</span><span class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> <span class="re0">$year</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$daysInMonth</span> <span class="sy0">=</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st_h">'t'</span><span class="sy0">,</span> <span class="re0">$firstDay</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$week</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$breakdown</span> &nbsp; <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="re0">$i</span> <span class="sy0">&lt;=</span> <span class="re0">$daysInMonth</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$date</span> <span class="sy0">=</span> <span class="kw3">mktime</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="re0">$month</span><span class="sy0">,</span> <span class="re0">$i</span><span class="sy0">,</span> <span class="re0">$year</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$day</span> &nbsp;<span class="sy0">=</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st_h">'l'</span><span class="sy0">,</span> <span class="re0">$date</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Sunday triggers the start of a new week, except if it's </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// also the first day of the month.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$day</span> <span class="sy0">==</span> <span class="st_h">'Sunday'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">!=</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$week</span><span class="sy0">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$breakdown</span><span class="br0">&#91;</span><span class="re0">$week</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$date</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$breakdown</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="re0">$results</span> <span class="sy0">=</span> monthToWeek<span class="br0">&#40;</span><span class="nu0">6</span><span class="sy0">,</span> <span class="nu0">2008</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;There are <span class="es6">%d</span> weeks in June 2008<span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$results</span> <span class="kw1">as</span> <span class="re0">$weekNumber</span> <span class="sy0">=&gt;</span> <span class="re0">$days</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Week <span class="es6">%d</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$weekNumber</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$days</span> <span class="kw1">as</span> <span class="re0">$day</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es6">%10s</span> &nbsp;<span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st0">&quot;l&quot;</span><span class="sy0">,</span> <span class="re0">$day</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st0">&quot;Y-m-d&quot;</span><span class="sy0">,</span> <span class="re0">$day</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/*<br />
There are 5 weeks in June 2008<br />
<br />
Week 1<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-01<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-02<br />
&nbsp; &nbsp;Tuesday &nbsp;2008-06-03<br />
&nbsp;Wednesday &nbsp;2008-06-04<br />
&nbsp; Thursday &nbsp;2008-06-05<br />
&nbsp; &nbsp; Friday &nbsp;2008-06-06<br />
&nbsp; Saturday &nbsp;2008-06-07<br />
<br />
Week 2<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-08<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-09<br />
&nbsp; &nbsp;Tuesday &nbsp;2008-06-10<br />
&nbsp;Wednesday &nbsp;2008-06-11<br />
&nbsp; Thursday &nbsp;2008-06-12<br />
&nbsp; &nbsp; Friday &nbsp;2008-06-13<br />
&nbsp; Saturday &nbsp;2008-06-14<br />
<br />
Week 3<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-15<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-16<br />
&nbsp; &nbsp;Tuesday &nbsp;2008-06-17<br />
&nbsp;Wednesday &nbsp;2008-06-18<br />
&nbsp; Thursday &nbsp;2008-06-19<br />
&nbsp; &nbsp; Friday &nbsp;2008-06-20<br />
&nbsp; Saturday &nbsp;2008-06-21<br />
<br />
Week 4<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-22<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-23<br />
&nbsp; &nbsp;Tuesday &nbsp;2008-06-24<br />
&nbsp;Wednesday &nbsp;2008-06-25<br />
&nbsp; Thursday &nbsp;2008-06-26<br />
&nbsp; &nbsp; Friday &nbsp;2008-06-27<br />
&nbsp; Saturday &nbsp;2008-06-28<br />
<br />
Week 5<br />
&nbsp; &nbsp; Sunday &nbsp;2008-06-29<br />
&nbsp; &nbsp; Monday &nbsp;2008-06-30<br />
*/</span><br />
<span class="sy1">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/08/i-hate-working-with-dates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extracing links from HTML using PHP</title>
		<link>http://project-2501.net/index.php/2008/05/extracing-links-from-html-using-php/</link>
		<comments>http://project-2501.net/index.php/2008/05/extracing-links-from-html-using-php/#comments</comments>
		<pubDate>Thu, 01 May 2008 07:30:31 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=79</guid>
		<description><![CDATA[Many months ago there was a PHP competition to make the smallest script to extract all the links from a document.  I&#8217;ve lost a link to the actual site, but the rules and conditions were set up expecting everyone to solve the problem with regular expressions.  In my opinion relying on regular expressions [...]]]></description>
			<content:encoded><![CDATA[<p>Many months ago there was a PHP competition to make the smallest script to extract all the links from a document.  I&#8217;ve lost a link to the actual site, but the rules and conditions were set up expecting everyone to solve the problem with regular expressions.  In my opinion relying on regular expressions to parse HTML would be a terrible idea (and may actually be impossible to do with a normal engine), so I tried a slightly different approach:</p>
<h3>Program listing.  162 Bytes.</h3>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span> <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="sy0">@</span>DOMDocument<span class="sy0">::</span><span class="me2">loadHTMLFile</span><span class="br0">&#40;</span><span class="re0">$argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$t</span><span class="br0">&#41;</span><span class="sy0">@</span><span class="re0">$u</span><span class="br0">&#91;</span><span class="re0">$t</span><span class="sy0">-&gt;</span><span class="me1">getAttribute</span><span class="br0">&#40;</span><span class="st_h">'href'</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>foreach<span class="br0">&#40;</span><span class="re0">$u</span> <span class="kw1">as</span> <span class="re0">$k</span><span class="sy0">=&gt;</span><span class="re0">$v</span><span class="br0">&#41;</span><span class="kw3">echo</span> <span class="re0">$k</span><span class="sy0">!=</span><span class="st_h">''</span>?<span class="st0">&quot;<span class="es4">$k</span><span class="es1">\n</span>&quot;</span><span class="sy0">:</span><span class="st_h">''</span><span class="sy0">;</span><span class="sy1">?&gt;</span></div></div>
<h3>Expanded program listing with comments</h3>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Using PHP DOMDocument class, we load in a HTML file from the </span><br />
&nbsp; &nbsp; <span class="co1">// command line and extract all the 'a' tags. &nbsp;The '@' is used to </span><br />
&nbsp; &nbsp; <span class="co1">// suppress any parse errors</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="sy0">@</span>DOMDocument<span class="sy0">::</span><span class="me2">loadHTMLFile</span><span class="br0">&#40;</span><span class="re0">$argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$t</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// We get the value of the href attribute and store is as a </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// key in $u. &nbsp;This is so each URL only appears once without </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// having to call array_unique(). &nbsp;'@' is used to suppress the </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// error when we add the first element to a non-existent array </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// $u (which PHP then kindly creates for us)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">@</span><span class="re0">$u</span><span class="br0">&#91;</span><span class="re0">$t</span><span class="sy0">-&gt;</span><span class="me1">getAttribute</span><span class="br0">&#40;</span><span class="st_h">'href'</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// Finally we iterate over the array of URLS ($u) and if the key </span><br />
&nbsp; &nbsp; <span class="co1">// (which is the actual URL) is empty don't do anything, else print</span><br />
&nbsp; &nbsp; <span class="co1">// the url followed by a new line.</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$u</span> <span class="kw1">as</span> <span class="re0">$k</span><span class="sy0">=&gt;</span><span class="re0">$v</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$k</span> <span class="sy0">!=</span> <span class="st_h">''</span> ? <span class="st0">&quot;<span class="es4">$k</span><span class="es1">\n</span>&quot;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="sy1">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/05/extracing-links-from-html-using-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple type checking in PHP</title>
		<link>http://project-2501.net/index.php/2008/04/simple-type-checking-in-php/</link>
		<comments>http://project-2501.net/index.php/2008/04/simple-type-checking-in-php/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 12:59:41 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=78</guid>
		<description><![CDATA[&#60;?php

&#160; &#160; error_reporting&#40;E_ALL &#124; E_STRICT&#41;;

/*

Manual optional type checking for PHP functions
&#160; &#160; 
Basic example:
&#160; &#160; 
&#160; &#160; function log_error($line_number, $filename, $desc)
&#160; &#160; {
&#160; &#160; &#160; &#160; CheckFunctionArgs('integer', 'string', 'string');
&#160; &#160; &#160; &#160; [snip]
&#160; &#160; }
&#160; &#160; 
Object example:
&#160; &#160; 
&#160; &#160; class LogObject {}
&#160; &#160; function register_object($obj)
&#160; &#160; {
&#160; &#160; &#160; &#160; //&#160; Check for [...]]]></description>
			<content:encoded><![CDATA[<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">error_reporting</span><span class="br0">&#40;</span><span class="kw2">E_ALL</span> <span class="sy0">|</span> <span class="kw2">E_STRICT</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="coMULTI">/*<br />
<br />
Manual optional type checking for PHP functions<br />
&nbsp; &nbsp; <br />
Basic example:<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; function log_error($line_number, $filename, $desc)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs('integer', 'string', 'string');<br />
&nbsp; &nbsp; &nbsp; &nbsp; [snip]<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; <br />
Object example:<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; class LogObject {}<br />
&nbsp; &nbsp; function register_object($obj)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; Check for an object<br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs('object');&nbsp; &nbsp; <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; When an object is passed, you can optionally check for the class name<br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs('LogObject');<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; [snip]<br />
&nbsp; &nbsp; }<br />
<br />
Wildcard example:<br />
<br />
&nbsp; &nbsp; function log_anything($line, $thing)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; '*' really means anything, included true/false/null or an empty string<br />
&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; however it doesn't mean the argument in optional<br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs('integer', '*');<br />
&nbsp; &nbsp; }<br />
<br />
Notes:<br />
<br />
&nbsp; &nbsp; Throws an exception on error<br />
&nbsp; &nbsp; No support for functions that take a variable number of arguments<br />
&nbsp; &nbsp; Must define the types of all arguments<br />
&nbsp; &nbsp; The type '*' acts as a wild card, matching anything (including null)<br />
&nbsp; &nbsp; Works with public and private methods in classes<br />
&nbsp; &nbsp; <br />
*/</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> CheckFunctionArgs<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$types</span> <span class="sy0">=</span> <span class="kw3">func_get_args</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$stack</span> <span class="sy0">=</span> <span class="kw3">debug_backtrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Make sure there is some stack information</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Stack[1] contains the details about the function that called this function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;No function stack present. &nbsp;Make sure CheckFunctionArgs() isn't called from the global scope&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; The arguments that were passed to the function we are checking</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$arguments</span> <span class="sy0">=</span> <span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'args'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Get the name of the class/function/file</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$functionClass</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'class'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'class'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="st0">&quot;::&quot;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$functionFile</span> &nbsp;<span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'file'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'file'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">':'</span> <span class="sy0">.</span> <span class="re0">$stack</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'line'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">'[No file information]'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$functionName</span> &nbsp;<span class="sy0">=</span> <span class="st0">&quot;<span class="es4">{$functionClass}</span><span class="es4">{$stack[1]['function']}</span>()&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Basic check, make sure the correct numbers of arguments were passed</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$arguments</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$types</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$passed</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$arguments</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$expected</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$types</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;Incorrect number of argumemts passed to <span class="es4">{$functionName}</span> in <span class="es4">{$functionFile}</span>. &nbsp;Expected <span class="es4">{$expected}</span> got <span class="es4">{$passed}</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Now try and check each argument</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="re0">$i</span> <span class="sy0">&lt;</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$arguments</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Allow a check to be skiped, if the type equals '*'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$types</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="st_h">'*'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$argumentType</span> <span class="sy0">=</span> <span class="kw3">gettype</span><span class="br0">&#40;</span><span class="re0">$arguments</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Check basic types like integer/object ect</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$argumentType</span> <span class="sy0">==</span> <span class="re0">$types</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Check to see if the type matches the classname of an object</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$argumentType</span> <span class="sy0">==</span> <span class="st_h">'object'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="kw3">get_class</span><span class="br0">&#40;</span><span class="re0">$arguments</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="re0">$types</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">&quot;Incorrect argument passed to <span class="es4">{$functionName}</span> in <span class="es4">{$functionFile}</span>. &nbsp;Argument <span class="es4">{$i}</span> was type <span class="es4">{$argumentType}</span> expected {<span class="es4">$types</span>[<span class="es4">$i</span>]}&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Some really basic tests</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> assertException<span class="br0">&#40;</span><span class="re0">$fun</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">call_user_func_array</span><span class="br0">&#40;</span><span class="re0">$fun</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st0">&quot;Error: No exception thrown in function <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$fun</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; catch<span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> assertNoException<span class="br0">&#40;</span><span class="re0">$fun</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">call_user_func_array</span><span class="br0">&#40;</span><span class="re0">$fun</span><span class="sy0">,</span> <span class="re0">$args</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; catch<span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st0">&quot;Error: Exception thrown in function <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$fun</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> test_string<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'string'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'abc'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'123'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="sy0">@</span>assertException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">123</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_string'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> test_integer<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'integer'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">123</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="sy0">@</span>assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu19">1.0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_integer'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu19">1.2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw2">function</span> test_wildcard<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'*'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_wildcard'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'a'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_wildcard'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">1233</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_wildcard'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="sy0">@</span>assertException<span class="br0">&#40;</span><span class="st_h">'test_wildcard'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw2">class</span> Foobar <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="re0">$foobar</span> <span class="sy0">=</span> <span class="kw2">new</span> Foobar<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> test_classname<span class="br0">&#40;</span><span class="re0">$a</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'Foobar'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CheckFunctionArgs<span class="br0">&#40;</span><span class="st_h">'object'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; assertNoException<span class="br0">&#40;</span><span class="st_h">'test_classname'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$foobar</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; assertException<span class="br0">&#40;</span><span class="st_h">'test_classname'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'Foobar'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="sy1">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/04/simple-type-checking-in-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>sizeof(int) = 68</title>
		<link>http://project-2501.net/index.php/2008/04/sizeofint-68/</link>
		<comments>http://project-2501.net/index.php/2008/04/sizeofint-68/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 00:03:02 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=77</guid>
		<description><![CDATA[Pankaj Kumar has a slightly disturbing look at memory usage in PHP.
Each element requires a value structure (zval) which takes 16 bytes.
Also requires a hash bucket &#8211; which takes 36 bytes. That gives 52 bytes
per value. Memory allocation headers take another 8 bytes*2 &#8211; which
gives 68 bytes. Pretty close to what you have.
]]></description>
			<content:encoded><![CDATA[<p>Pankaj Kumar has a slightly disturbing look at <a href="http://pankaj-k.net/weblog/2008/03/did_you_know_that_each_integer.html">memory usage in PHP</a>.</p>
<blockquote><p>Each element requires a value structure (zval) which takes 16 bytes.<br />
Also requires a hash bucket &#8211; which takes 36 bytes. That gives 52 bytes<br />
per value. Memory allocation headers take another 8 bytes*2 &#8211; which<br />
gives 68 bytes. Pretty close to what you have.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/04/sizeofint-68/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fun with anagrams</title>
		<link>http://project-2501.net/index.php/2008/03/fun-with-anagrams/</link>
		<comments>http://project-2501.net/index.php/2008/03/fun-with-anagrams/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 12:40:09 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=76</guid>
		<description><![CDATA[&#60;?php

define&#40;'WORD_LIST_FILENAME', '/usr/share/dict/words'&#41;;


class AnagramLookup
&#123;
&#160; &#160; private $lookup;

&#160; &#160; //&#160; Loads a file with one word per line
&#160; &#160; private function load_word_list&#40;$filename&#41;
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; $lines = file&#40;$filename&#41;; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; // One word per line
&#160; &#160; &#160; &#160; $lines = array_map&#40;'trim', $lines&#41;; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="kw3">define</span><span class="br0">&#40;</span><span class="st_h">'WORD_LIST_FILENAME'</span><span class="sy0">,</span> <span class="st_h">'/usr/share/dict/words'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="kw2">class</span> AnagramLookup<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$lookup</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Loads a file with one word per line</span><br />
&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> load_word_list<span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lines</span> <span class="sy0">=</span> <span class="kw3">file</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// One word per line</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lines</span> <span class="sy0">=</span> <span class="kw3">array_map</span><span class="br0">&#40;</span><span class="st_h">'trim'</span><span class="sy0">,</span> <span class="re0">$lines</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Strip any excess whitespace</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lines</span> <span class="sy0">=</span> <span class="kw3">array_filter</span><span class="br0">&#40;</span><span class="re0">$lines</span><span class="sy0">,</span> <span class="st_h">'ctype_alpha'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Words been to match [a-zA-Z]</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lines</span> <span class="sy0">=</span> <span class="kw3">array_map</span><span class="br0">&#40;</span><span class="st_h">'strtolower'</span><span class="sy0">,</span> <span class="re0">$lines</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; <span class="co1">// Set all the words to lowercase</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lines</span> <span class="sy0">=</span> <span class="kw3">array_unique</span><span class="br0">&#40;</span><span class="re0">$lines</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// Remove any duplicate words</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lines</span> <span class="sy0">=</span> <span class="kw3">array_diff</span><span class="br0">&#40;</span><span class="re0">$lines</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; <span class="co1">// Remove any empty lines</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$lines</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Sort the individual letters in a string</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; i.e. &nbsp; tale &nbsp;=&gt; &nbsp;aelt</span><br />
&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> sort_letters<span class="br0">&#40;</span><span class="re0">$word</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$letters</span> <span class="sy0">=</span> str_split<span class="br0">&#40;</span><span class="re0">$word</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sort</span><span class="br0">&#40;</span><span class="re0">$letters</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sorted_word</span> <span class="sy0">=</span> <span class="kw3">implode</span><span class="br0">&#40;</span><span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$letters</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$sorted_word</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Generate our lookup table. &nbsp;This takes ~1.5second for 70,000 words</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; $lookup ends up looking like:</span><br />
&nbsp; &nbsp; <span class="co1">//</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; $lookup[4] = array</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; (</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; &nbsp; &nbsp; 'aelt' =&gt; array('late', 'tale', 'leta', 'teal'),</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; &nbsp; &nbsp; 'belu' =&gt; array('blue', 'lube'),</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; &nbsp; &nbsp; [etc...]</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; )</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; $lookup[5] = array</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; (</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; &nbsp; &nbsp; 'allms' =&gt; array('small', 'malls'),</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; &nbsp; &nbsp; [etc...]</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; )</span><br />
&nbsp; &nbsp; <span class="co1">//</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; 4 and 5 are the word lengths, while 'aelt', 'belu' and 'allms' &nbsp;contains </span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; an array of all the words that can be spelt using these letters</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$word_list</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">load_word_list</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lookup</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$word_list</span> <span class="kw1">as</span> <span class="re0">$word</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$length</span> <span class="sy0">=</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re0">$word</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$lookup</span><span class="br0">&#91;</span><span class="re0">$length</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lookup</span><span class="br0">&#91;</span><span class="re0">$length</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sorted_word</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">sort_letters</span><span class="br0">&#40;</span><span class="re0">$word</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$lookup</span><span class="br0">&#91;</span><span class="re0">$length</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$sorted_word</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lookup</span><span class="br0">&#91;</span><span class="re0">$length</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$sorted_word</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lookup</span><span class="br0">&#91;</span><span class="re0">$length</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$sorted_word</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$word</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">lookup</span> <span class="sy0">=</span> <span class="re0">$lookup</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Return all the anagrams of the passed word</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> lookup_word<span class="br0">&#40;</span><span class="re0">$word</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$word_length</span> <span class="sy0">=</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re0">$word</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sorted_word</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">sort_letters</span><span class="br0">&#40;</span><span class="re0">$word</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">lookup</span><span class="br0">&#91;</span><span class="re0">$word_length</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$sorted_word</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">lookup</span><span class="br0">&#91;</span><span class="re0">$word_length</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$sorted_word</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Return an array of all the sets of anagrams with a specific length</span><br />
&nbsp; &nbsp; <span class="co1">//</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Example result for a word length of 14:</span><br />
&nbsp; &nbsp; <span class="co1">//</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; array</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; (</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; &nbsp; &nbsp; [0] =&gt; array('certifications','rectifications'),</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; &nbsp; &nbsp; [1] =&gt; array('impressiveness','permissiveness'),</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; &nbsp; &nbsp; [2] =&gt; array('tablespoonfuls','tablespoonsful'),</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; )</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> all_of_length<span class="br0">&#40;</span><span class="re0">$word_length</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">lookup</span><span class="br0">&#91;</span><span class="re0">$word_length</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$results</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">lookup</span><span class="br0">&#91;</span><span class="re0">$word_length</span><span class="br0">&#93;</span> <span class="kw1">as</span> <span class="re0">$words</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$words</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$results</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$words</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$results</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="re0">$anagram</span> <span class="sy0">=</span> <span class="kw2">new</span> AnagramLookup<span class="br0">&#40;</span>WORD_LIST_FILENAME<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Anagrams of 'blue': <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">implode</span><span class="br0">&#40;</span><span class="st_h">', '</span><span class="sy0">,</span> <span class="re0">$anagram</span><span class="sy0">-&gt;</span><span class="me1">lookup_word</span><span class="br0">&#40;</span><span class="st_h">'blue'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Anagrams of 'late': <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">implode</span><span class="br0">&#40;</span><span class="st_h">', '</span><span class="sy0">,</span> <span class="re0">$anagram</span><span class="sy0">-&gt;</span><span class="me1">lookup_word</span><span class="br0">&#40;</span><span class="st_h">'late'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Anagrams of 'slow': <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">implode</span><span class="br0">&#40;</span><span class="st_h">', '</span><span class="sy0">,</span> <span class="re0">$anagram</span><span class="sy0">-&gt;</span><span class="me1">lookup_word</span><span class="br0">&#40;</span><span class="st_h">'slow'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Anagrams of 'seven': &nbsp;<span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">implode</span><span class="br0">&#40;</span><span class="st_h">', '</span><span class="sy0">,</span> <span class="re0">$anagram</span><span class="sy0">-&gt;</span><span class="me1">lookup_word</span><span class="br0">&#40;</span><span class="st_h">'seven'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Anagrams of 'anagram': <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">implode</span><span class="br0">&#40;</span><span class="st_h">', '</span><span class="sy0">,</span> <span class="re0">$anagram</span><span class="sy0">-&gt;</span><span class="me1">lookup_word</span><span class="br0">&#40;</span><span class="st_h">'anagram'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;All anagrams of word length 14<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$anagram</span><span class="sy0">-&gt;</span><span class="me1">all_of_length</span><span class="br0">&#40;</span><span class="nu0">7</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$words</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot; * <span class="es6">%s</span><span class="es1">\n</span>&quot;</span><span class="sy0">,</span> <span class="kw3">implode</span><span class="br0">&#40;</span><span class="st_h">', '</span><span class="sy0">,</span> <span class="re0">$words</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="sy1">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/03/fun-with-anagrams/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>phpt testing framework</title>
		<link>http://project-2501.net/index.php/2008/02/phpt-testing-framework/</link>
		<comments>http://project-2501.net/index.php/2008/02/phpt-testing-framework/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 10:00:51 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=70</guid>
		<description><![CDATA[PHPT is the kind framework that encourages testing simply by making everything so easy.  All that&#8217;s needed is a file with your PHP code and expected output.  It wont replace SimpleTest or PhpUnit for anything complicated (say, like PHP itself&#8230;)  but it seems to be just what I&#8217;m after.
There&#8217;s little documentation about [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://phpt.info/">PHPT</a> is the kind framework that encourages testing simply by making everything so easy.  All that&#8217;s needed is a file with your PHP code and expected output.  It wont replace SimpleTest or PhpUnit for anything complicated (say, like PHP itself&#8230;)  but it seems to be just what I&#8217;m after.</p>
<p>There&#8217;s little documentation about (<a href="http://qa.php.net/write-test.php">PHP QA website</a> was the best resource I found), but thanks to its simplicity all you need to get started is an example or two.</p>
<p><strong>Sample phpt file</strong></p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace">--TEST--<br />
AusPostCheck class<br />
--FILE--<br />
<span class="kw2">&lt;?php</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;../../../test/newGuiTest/bootstrap.php&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;../check_contact_details.php&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw3">var_dump</span><span class="br0">&#40;</span>AusPostCheck<span class="sy0">::</span><span class="me2">SuburbStatePostcodeMatch</span><span class="br0">&#40;</span><span class="st_h">'Windsor'</span><span class="sy0">,</span> <span class="st_h">'VIC'</span><span class="sy0">,</span> <span class="st_h">'3181'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">var_dump</span><span class="br0">&#40;</span>AusPostCheck<span class="sy0">::</span><span class="me2">SuburbStatePostcodeMatch</span><span class="br0">&#40;</span><span class="st_h">'Windsor'</span><span class="sy0">,</span> <span class="st_h">'VIC'</span><span class="sy0">,</span> <span class="st_h">'3182'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">var_dump</span><span class="br0">&#40;</span>AusPostCheck<span class="sy0">::</span><span class="me2">SuburbStatePostcodeMatch</span><span class="br0">&#40;</span><span class="st_h">'Windsor'</span><span class="sy0">,</span> <span class="st_h">'NSW'</span><span class="sy0">,</span> <span class="st_h">'3181'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">var_dump</span><span class="br0">&#40;</span>AusPostCheck<span class="sy0">::</span><span class="me2">SuburbStatePostcodeMatch</span><span class="br0">&#40;</span><span class="st_h">'Prahran'</span><span class="sy0">,</span> <span class="st_h">'VIC'</span><span class="sy0">,</span> <span class="st_h">'3181'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">var_dump</span><span class="br0">&#40;</span>AusPostCheck<span class="sy0">::</span><span class="me2">SuburbStatePostcodeMatch</span><span class="br0">&#40;</span><span class="st_h">'Foobar'</span><span class="sy0">,</span> <span class="st_h">'VIC'</span><span class="sy0">,</span> <span class="st_h">'3181'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="sy1">?&gt;</span><br />
--EXPECT--<br />
string(5) &quot;MATCH&quot;<br />
string(8) &quot;NO_MATCH&quot;<br />
string(8) &quot;NO_MATCH&quot;<br />
string(5) &quot;MATCH&quot;<br />
string(9) &quot;NO_SUBURB&quot;</div></div>
<p><strong>Sample output</strong></p>
<div class="codecolorer-container dos " style="overflow:auto;white-space:nowrap;width:540px"><div class="dos codecolorer" style="font-family:Monaco,Lucida Console,monospace">margaret ~/tests $ phpt<br />
PHPT Test Runner v0.1.1alpha<br />
<br />
.<br />
<br />
Test Cases Run: <span class="nu0">1</span>, Passes: <span class="nu0">1</span>, Failures: <span class="nu0">0</span>, Skipped: <span class="nu0">0</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/02/phpt-testing-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Awful code I&#8217;ve written today</title>
		<link>http://project-2501.net/index.php/2008/01/awful-code-ive-written-today/</link>
		<comments>http://project-2501.net/index.php/2008/01/awful-code-ive-written-today/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 01:17:57 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=68</guid>
		<description><![CDATA[$row = $table-&#62;tr&#40;&#41;;

if&#40;!&#40;$amIAltOrNot = !$amIAltOrNot&#41;&#41;
&#123;
&#160; &#160; $row-&#62;class = &#34;alt&#34;;
&#125;


//&#160; Edit: Much better now
$row = $table-&#62;tr&#40;&#41;;

$row-&#62;class = &#40;$amIAltOrNot = !$amIAltOrNot&#41; ? &#34;&#34; : &#34;alt&#34;;
]]></description>
			<content:encoded><![CDATA[<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re0">$row</span> <span class="sy0">=</span> <span class="re0">$table</span><span class="sy0">-&gt;</span><span class="me1">tr</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span><span class="re0">$amIAltOrNot</span> <span class="sy0">=</span> <span class="sy0">!</span><span class="re0">$amIAltOrNot</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$row</span><span class="sy0">-&gt;</span><span class="me1">class</span> <span class="sy0">=</span> <span class="st0">&quot;alt&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="co1">//&nbsp; Edit: Much better now</span><br />
<span class="re0">$row</span> <span class="sy0">=</span> <span class="re0">$table</span><span class="sy0">-&gt;</span><span class="me1">tr</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="re0">$row</span><span class="sy0">-&gt;</span><span class="me1">class</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="re0">$amIAltOrNot</span> <span class="sy0">=</span> <span class="sy0">!</span><span class="re0">$amIAltOrNot</span><span class="br0">&#41;</span> ? <span class="st0">&quot;&quot;</span> <span class="sy0">:</span> <span class="st0">&quot;alt&quot;</span><span class="sy0">;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/01/awful-code-ive-written-today/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Now with added Slicehost</title>
		<link>http://project-2501.net/index.php/2008/01/now-with-added-slicehost/</link>
		<comments>http://project-2501.net/index.php/2008/01/now-with-added-slicehost/#comments</comments>
		<pubDate>Sat, 26 Jan 2008 07:39:59 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://project-2501.net/?p=67</guid>
		<description><![CDATA[This website is now hosted on Slicehost  (along with section99.net).  It&#8217;s a little early to know how it will turn out, but so far I&#8217;m loving having not only a shell, but root access.
Signing up was completely painless and the the VPS was provisioned within minutes with several different operating system options (though [...]]]></description>
			<content:encoded><![CDATA[<p>This website is now hosted on <a href="http://slicehost.com">Slicehost</a>  (along with <a href="http://section99.net">section99.net</a>).  It&#8217;s a little early to know how it will turn out, but so far I&#8217;m loving having not only a shell, but root access.</p>
<p>Signing up was completely painless and the the VPS was provisioned within minutes with several different operating system options (though I&#8217;m aware that this can sometimes take weeks depending on current capacity).  While I run the bleeding edge version of Ubuntu at work, I opted for the slightly safer option, Ubuntu 6.06 LTS.</p>
<p>Setting up Lighty / PHP and Mysql took mere minutes thanks to apt-get and Debian&#8217;s sane default configuration.  Wordpress took a tiny bit of fiddling in Mysql so I could test it on another domain name, but aside from that, everything has been very painless.</p>
<p>I&#8217;m hoping that this gives me the chance to play with some <a href="http://webpy.org/">webpy</a> and even (<em>maybe</em>) some rails applications.</p>
<p>The only problem I&#8217;ve had (except for screwing up the DNS) is editing my crontab when loged in as a normal user.  I&#8217;m unable to edit it due to a weird permission error.  While it&#8217;s not a huge problem (root can edit anybodies crontab easily) but it&#8217;s odd that the only real information I can find is related to an old Debian bug.</p>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/01/now-with-added-slicehost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More useless PHP &#8211; Inplace Reverse</title>
		<link>http://project-2501.net/index.php/2008/01/more-useless-php-inplace-reverse/</link>
		<comments>http://project-2501.net/index.php/2008/01/more-useless-php-inplace-reverse/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 07:30:19 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://section99.net/?p=66</guid>
		<description><![CDATA[Code
&#60;?php

/*

&#160; &#160; PHP implementation of a common programming problem:

&#160; &#160; &#160; &#160; Reversing a singly linked list

*/


&#160; &#160; error_reporting&#40;E_ALL &#124; E_STRICT&#41;;


&#160; &#160; //&#160; This is our basic node
&#160; &#160; class WordNode
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; public $word;
&#160; &#160; &#160; &#160; public $nextNode;

&#160; &#160; &#160; &#160; public function __construct&#40;$word = null&#41;
&#160; &#160; &#160; &#160; &#123;
&#160; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Code</strong></p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px;height:300px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">&lt;?php</span><br />
<br />
<span class="coMULTI">/*<br />
<br />
&nbsp; &nbsp; PHP implementation of a common programming problem:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Reversing a singly linked list<br />
<br />
*/</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw3">error_reporting</span><span class="br0">&#40;</span><span class="kw2">E_ALL</span> <span class="sy0">|</span> <span class="kw2">E_STRICT</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; This is our basic node</span><br />
&nbsp; &nbsp; <span class="kw2">class</span> WordNode<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re0">$word</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re0">$nextNode</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$word</span> <span class="sy0">=</span> <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">word</span> <span class="sy0">=</span> <span class="re0">$word</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Print all content of this node, and linked nodes</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __toString<span class="br0">&#40;</span><span class="re0">$separator</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> &nbsp;<span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$current</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Append the separator as long as there is a next node</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> <span class="sy0">.=</span> <span class="re0">$current</span><span class="sy0">-&gt;</span><span class="me1">word</span> <span class="sy0">.</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$current</span><span class="sy0">-&gt;</span><span class="me1">nextNode</span> <span class="sy0">!==</span> <span class="kw2">null</span><span class="br0">&#41;</span> ? <span class="re0">$separator</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$current</span> <span class="sy0">=</span> <span class="re0">$current</span><span class="sy0">-&gt;</span><span class="me1">nextNode</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$buffer</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Takes an array and turns it into a linked list</span><br />
&nbsp; &nbsp; <span class="co1">//&nbsp; (Remember this is purely an academic exercise :-)</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> buildWordNodeList<span class="br0">&#40;</span><span class="re0">$sourceArray</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; First step create the linked list</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$firstNode</span> <span class="sy0">=</span> <span class="kw2">new</span> WordNode<span class="br0">&#40;</span><span class="re0">$sourceArray</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lastNode</span> <span class="sy0">=</span> <span class="re0">$firstNode</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="kw3">array_slice</span><span class="br0">&#40;</span><span class="re0">$sourceArray</span><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$word</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$thisNode</span> <span class="sy0">=</span> <span class="kw2">new</span> WordNode<span class="br0">&#40;</span><span class="re0">$word</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lastNode</span><span class="sy0">-&gt;</span><span class="me1">nextNode</span> <span class="sy0">=</span> <span class="re0">$thisNode</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$lastNode</span> <span class="sy0">=</span> <span class="re0">$thisNode</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$firstNode</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="co1">//&nbsp; Inplace reverse</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> reverseWordNodeListInplace<span class="br0">&#40;</span>WordNode <span class="sy0">&amp;</span><span class="re0">$head</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Init the loop by separating the top node, and </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; keeping track of what is left ($tail)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$tail</span> <span class="sy0">=</span> <span class="re0">$head</span><span class="sy0">-&gt;</span><span class="me1">nextNode</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; This is set to null as it will end up being the </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; last node and shouldn't point anywhere</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$head</span><span class="sy0">-&gt;</span><span class="me1">nextNode</span> <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$tail</span> <span class="sy0">!==</span> <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Take the next node, and seperate it, and again</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; keep track of what's left</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$next</span> <span class="sy0">=</span> <span class="re0">$tail</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$tail</span> <span class="sy0">=</span> <span class="re0">$next</span><span class="sy0">-&gt;</span><span class="me1">nextNode</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; Now make this node the parent of the previous top node</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$next</span><span class="sy0">-&gt;</span><span class="me1">nextNode</span> <span class="sy0">=</span> <span class="re0">$head</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&nbsp; This node is now at the top</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$head</span> <span class="sy0">=</span> <span class="re0">$next</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="re0">$list</span> <span class="sy0">=</span> buildWordNodeList<span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;a&quot;</span><span class="sy0">,</span><span class="st0">&quot;b&quot;</span><span class="sy0">,</span><span class="st0">&quot;c&quot;</span><span class="sy0">,</span><span class="st0">&quot;d&quot;</span><span class="sy0">,</span><span class="st0">&quot;e&quot;</span><span class="sy0">,</span><span class="st0">&quot;f&quot;</span><span class="sy0">,</span><span class="st0">&quot;g&quot;</span><span class="sy0">,</span><span class="st0">&quot;h&quot;</span><span class="sy0">,</span> <span class="st0">&quot;i&quot;</span><span class="sy0">,</span> <span class="st0">&quot;j&quot;</span><span class="sy0">,</span> <span class="st0">&quot;k&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$list</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; reverseWordNodeListInplace<span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$list</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; reverseWordNodeListInplace<span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$list</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$list</span><span class="sy0">-&gt;</span>__toString<span class="br0">&#40;</span><span class="st0">&quot; &quot;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
<br />
<span class="sy1">?&gt;</span></div></div>
<p><strong>Output</strong></p>
<div class="codecolorer-container dos " style="overflow:auto;white-space:nowrap;width:540px"><div class="dos codecolorer" style="font-family:Monaco,Lucida Console,monospace">abcdefghijk<br />
kjihgfedcba<br />
abcdefghijk<br />
a b c d e f g h i j k</div></div>
]]></content:encoded>
			<wfw:commentRss>http://project-2501.net/index.php/2008/01/more-useless-php-inplace-reverse/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
