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 здесь является объектом класса SplFileInfo, поэтому мы можем использовать все его методы.
Парсим 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 ?>
Вот и все пока Как видим, прогресс не стоит на месте и со временем всё сводится к уменьшению повторения кода и изобретения велосипеда.
О, спасибо, очень полезно… Я даже про glob не знал, просто не пользуюсь поиском по фс с помощью php.
Полезные классы, возьму на заметку.
[…] SPL в PHP. Продолжение […]
одного не могу понять: накой хер нужно csv в SplFileInfo. ЭТО ДУРОСТЬ. опять делают из пхп пхп … лучше бы уж сделали нормальный класс CsvFile который бы в конструктор принимал SplFileInfo || string filename