SPL в PHP. Продолжение
Как я обещал в предыдущей статье про SPL – даю обзор некоторых новых возможностей этой библиотеки, появившихся в PHP 5.3. Честно говоря, PHP 5.3 находится в стадии Release Candidate, т.е. это пока нестабильная версия, но исходники ее можно скачать и скомпилировать, после чего оценить эти новые возможности
Итак, что нового в SPL в PHP 5.3…
GlobIterator
Все, наверное, знают удобную функцию glob для поиска файлов в заданной директории по поисковому шаблону. Класс GlobIterator – не что иное, как обертка над этой полезной функцией, которая еще больше облегчает нам жизнь:
<?php
// найдем все текстовые файлы в заданной директории
$pattern = '/home/user/*.txt';
$files = new GlobIterator($pattern);
foreach ($files as $file) {
echo $file->getPathname().' - '.$file->getSize();
}
?>
Заметим, что $file здесь является объектом класса , поэтому мы можем использовать все его методы.
Парсим CSV-файл с помощью SplFileObject
<?php
$file = new SplFileObject('/home/user/myfile.csv');
$delimiter = ';';
$enclosure = "\n";
$file->setCsvControl($delimiter, $enclosure);
while ($file->valid()) {
$data = $file->fgetcsv();
// переменная $data содержит массив значений каждого поля CSV-файла на текущей строке
$file->next();
}
?>
Организация стека с помощью SplStack
С помощью этого класса очень удобно и просто работать со стеком:
<?php
$stack = new SplStack();
$stack->push('1');
$stack->push('2');
$stack->push('3');
echo $stack->pop()."\n"; // 3
echo $stack->pop()."\n"; // 2
echo $stack->pop()."\n"; // 1
?>
Сортировка массивов с помощью SplHeap
Класс SplHeap сам по себе является абстрактным, от него наследуются два класса: SplMaxHeap – для сортировки массива по убыванию его значений, SplMinHeap – по возрастанию. Пример:
<?php
$heap = new SplMaxHeap();
$heap->insert('123');
$heap->insert('456');
$heap->insert('789');
echo $heap->extract()."\n"; // 789
echo $heap->extract()."\n"; // 456
echo $heap->extract()."\n"; // 123
$heap = new SplMinHeap();
$heap->insert('456');
$heap->insert('789');
$heap->insert('123');
echo $heap->extract()."\n"; // 123
echo $heap->extract()."\n"; // 456
echo $heap->extract()."\n"; // 789
?>
Также можно отсортировать значения массива с помощью класса SplPriorityQueue (еще один производный от SplHeap класс) – для этого нужно задать для каждого значения приоритет при сортировке:
<?php
$pqueue = new SplPriorityQueue();
$pqueue->setExtractFlags(SplPriorityQueue::EXTR_DATA);
$pqueue->insert('low', 1);
$pqueue->insert('top', 3);
$pqueue->insert('medium', 2);
echo 'Высший элемент: '.$pqueue->top()."\n"; // Высший элемент: top
echo $pqueue->extract()."\n"; // top
echo $pqueue->extract()."\n"; // medium
echo $pqueue->extract()."\n"; // low
?>
С помощью метода setExtractFlags можно выбрать, что именно мы хотим извлечь из очереди с помощью extract():
EXTR_DATA – только значение массива
EXTR_PRIORITY – только значение приоритета
EXTR_BOTH – и то и другое (в виде массива)
Организация связанных списков с помощью SplDoublyLinkedList
Как известно, есть два принципа извлечения значения из списка – FIFO (First In First Out – первый зашел, первый ушел) и LIFO (Last In First Out – последний зашел, первый ушел – как патрон в магазине автомата).
С помощью SplDoublyLinkedList можно извлекать значения по любому из этих принципов:
<?php
$list = new SplDoublyLinkedList();
$list->push('1');
$list->push('2');
$list->push('3');
echo 'Последний: '.$list->top()."\n"; // Последний: 3
echo 'Первый: '.$list->bottom()."\n"; // Первый: 1
echo "FIFO:\n";
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($list->rewind(); $list->valid(); $list->next()) {
echo $list->current()."\n";
}
// Вывод будет таким:
// FIFO:
// 1
// 2
// 3
echo "LIFO:\n";
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
for ($list->rewind(); $list->valid(); $list->next()) {
echo $list->current()."\n";
}
// Вывод будет таким:
// LIFO:
// 3
// 2
// 1
?>
Вот и все пока
Как видим, прогресс не стоит на месте и со временем всё сводится к уменьшению повторения кода и изобретения велосипеда.
Март 30th, 2009
О, спасибо, очень полезно… Я даже про glob не знал, просто не пользуюсь поиском по фс с помощью php.
Март 30th, 2009
Полезные классы, возьму на заметку.
Июль 14th, 2009
[...] SPL в PHP. Продолжение [...]
Октябрь 12th, 2009
одного не могу понять: накой хер нужно csv в SplFileInfo. ЭТО ДУРОСТЬ. опять делают из пхп пхп … лучше бы уж сделали нормальный класс CsvFile который бы в конструктор принимал SplFileInfo || string filename