RkBlog

Hardware, programming and astronomy tutorials and reviews.

Iteratory

Artykuł opisuje listowanie katalogów, parsowanie XML i inne operacje możliwe do wykonania za pomocą iteratorów wprowadzonych w PHP5

Możliwości iteratorów w PHP5 uległy znacznemu usprawnieniu, pojawiło się wiele nowych. Iteratory umożliwiają listowanie danych poprzez foreach, z tym że wprowadzane dane nie są tablicami (do czego zazwyczaj foreach jest używany). Pierwszy iterator to DirectoryIterator umożliwiający listowanie zawartości katalogu:
<?php
foreach(new DirectoryIterator('./') as $entry)
	{
	IF(!$entry->isDot())
		{
		echo $entry->getFilename().'<br />';
		}
	}
Co wylistuje nam zawartość bieżącego katalogu. Najważniejsze metody tej klasy to:
Iterować można też przez wyniki zapytania SQLite, obiekt SimpleXML, dostępny jest też iterator dla MySQLi. Np. mając plik XML:
<config>
	<database>
		<db id="0" type="mysqli" host="localhost" password="" user="root" dbname="rkcmf2" prefix="prefix_" />
		<db id="1" type="mysqli" host="localhost" password="" user="root" dbname="biblioteka" prefix="cms_rk_" />
		<db id="2" type="postgresql" host="localhost" password="" user="root" dbname="biblioteka" prefix="cms_rk_" />
	</database>
</config>
By pobrać wszystkie atrybuty "type" wystarczy poniższy kod (można też skorzystać z SimpleXMLInterator(KOD XML)):
<?php
$config = simplexml_load_string('plik.xml');
IF($id === 'foo' and is_object($config))
	{
	$iter = 0;
	foreach($config->database->db as $val)
		{
		echo $config->database->db[$iter]['type'];
		$iter++;
		}
	unset($iter);
	}
Kolejnym ciekawym iteratorem jest LimitIterator umożliwiający ograniczanie ilości wyników:
<?php
foreach(new LimitIterator(new DirectoryIterator('./'), 2, 2) as $entry)
	{
	IF(!$entry->isDot())
		{
		echo $entry->getFilename().'<br />';
		}
	}
Iterator LimitIterator pobiera 3 argumenty - iterator, początkowy element, ilość elementów do wyświetlenia.
Kolejnym bardzo przydatnym iteratorem może być iterator rekursywny a dokładniej ResursiveIteratorIterator i RecursiveDirectoryIterator potrafiące wylistować również zawartości podkatalogów:
<?php
$dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./'), true);
foreach($dir as $file)
	{
	echo $file->getPathname().'<br />';
	}
Nieco inny przykład wyświetlający listę w postaci czegoś podobnego do "drzewa katalogów":
<?php
class DirTree extends RecursiveIteratorIterator
{
function current()
	{
	return str_repeat('- ', $this->getDepth()) . '/' . parent::current();
	}
}
$dir = new DirTree(new RecursiveDirectoryIterator('./'), true);
foreach($dir as $file)
	{
	echo $file.'<br />';
	}
RkBlog

Podstawy PHP, 14 July 2008,

Comment article