Iteratory
14 July 2008
Comments
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 />';
}
}
- getPath() - zwraca pełną ścieżkę do pliku/katalogu
- getFilename() - zwraca nazwę elementu
- getPathname - zwraca ścieżkę z nazwą pliku
- isDir() - zwraca prawda/fałsz jeżeli wpis jest katalogiem
- isDot() - zwraca prawda/fałsz jeżeli wpis jest kropką (. lub ..)
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>
<?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);
}
<?php
foreach(new LimitIterator(new DirectoryIterator('./'), 2, 2) as $entry)
{
IF(!$entry->isDot())
{
echo $entry->getFilename().'<br />';
}
}
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 />';
}
<?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
Comment article