Daily Archives: March 30, 2006

PHP5 Iterators

I’m late to the PHP5 party. When it was released I kicked the tyres, wrote a few sample scripts, but lacked the time and resources to deploy it properly.

But as I’m about to start a large new project, it’s time to bite the bullet!

I’m playing around with Xapian, which is a C++ search library with a nice object oriented interface, but the PHP bindings for it exposed it as a series of functions, so I set about writing a wrapper to mimic the “real” API.

I noticed several classes implemented an iterator, so I thought it would be an opportunity to try and use the Iterator interface, and found a great article on PHP5 Iterators over at Scatterism.

Within a few minutes, I was able to turn a slightly ugly Xapian loop into a nice foreach – behold!

Before

$mseti = MSet_begin($matches);
$end=MSet_end($matches);
while (! MSetIterator_equals($mseti, $end)) {
        $doc=MSetIterator_get_document($mseti);
	$percent=MSetIterator_get_percent($mseti);
	$docdata=Document_get_data($doc);
	MSetIterator_next($mseti);
}

And after!

$mseti=$matches->begin();
foreach($mseti as $doc){
	$percent=$mseti->get_percent();
	$docdata=$doc->get_data();
}

Proof that iterators really do wash whiter and shift the stains inferior patterns leave behind :)