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
?>

Вот и все пока :) Как видим, прогресс не стоит на месте и со временем всё сводится к уменьшению повторения кода и изобретения велосипеда.



Теги:


Читайте также:



4 Ответов на “SPL в PHP. Продолжение”

  1. О, спасибо, очень полезно… Я даже про glob не знал, просто не пользуюсь поиском по фс с помощью php.

  2. Igor

    Полезные классы, возьму на заметку.

  3. […] SPL в PHP. Продолжение […]

  4. одного не могу понять: накой хер нужно csv в SplFileInfo. ЭТО ДУРОСТЬ. опять делают из пхп пхп … лучше бы уж сделали нормальный класс CsvFile который бы в конструктор принимал SplFileInfo || string filename


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map