Процесс разработки на PHP в основном связан с получением и обработкой данных из разных источников, таких как базы данных, локальные файлы, удаленные API и т. д. Разработчики тратят много времени на организацию данных, их получение, перемещение и обработку. Наиболее часто используемая структура для представления данных в PHP — это array
. Однако в ряде случаев массивы не подходят для решения задач из-за недостаточной производительности и чрезмерного потребления памяти, в связи с чем требуются более подходящие структуры данных.
Использование Стандартной библиотеки PHP, SPL и знание ее состава — область, владение которой может подтвердить компетентность PHP-разработчика.
SPL похож на шаблоны, но исключительно для данных. Чаще всего это не упрощает написание кода, а упрощает его понимание другими (или вами через некоторое время). Конечно, если вы использовали его хорошо и правильно.
Двусвязные списки
SplDoublyLinkedList
— Двусвязные списки — это разновидность «стандартных» связанных списков, где каждый узел имеет указатель на предыдущий узел, а также указатель на следующий узел.
Представьте, что вы стоите в очереди в банке и при этом можете видеть только человека перед собой и позади себя. Это аналогия отношения между элементами в SplDoublyLinkedList
. Вставка элемента в список соответствует ситуации, когда кто-то залез в очередь, а вы вдруг забыли, кто перед вами стоит (и этот кто-то забыл о вас). Двусвязный список позволяет эффективно обходить и добавлять большие наборы данных без повторного хеширования.
SplDoublyLinkedList
SplStack
SplQueue
SplQueue
и SplStack
очень похожи на SplDoublyLinkedList
. Обе эти структуры, по сути, представляют собой двусвязные списки с разными флагами итераторов (IT_MODE_LIFO
— Last In First Out и IT_MODE_FIFO
— First In First Out), которые регулируют порядок обработки узлов и что делать с этими элементами после их обработки. обработанный. Другое различие между этими структурами заключается в том, что интерфейс SplQueue
содержит более интуитивно понятные методы enqueue()
и dequeue()
, в отличие от методов push()
и pop()
SplStack
.
$stack = new \SplStack(); // add items to the stack $stack->push('1'); $stack->push('2'); $stack->push('3'); echo $stack->count(); // 3 echo $stack->top(); // 3 echo $stack->bottom(); // 1 echo $stack->serialize(); // i:6;:s:1:"1";:s:1:"2";:s:1:"3"; // retrieve items from the stack echo $stack->pop(); // 3 echo $stack->pop(); // 2 echo $stack->pop(); // 1
$queue = new \SplQueue(); $queue->setIteratorMode(SplQueue::IT_MODE_DELETE); $queue->enqueue('one'); $queue->enqueue('two'); $queue->enqueue('three'); $queue->dequeue(); $queue->dequeue(); echo $queue->top(); // three
Стеки широко используются при анализе или обработке вложенных структур данных, в частности при вычислении математических выражений.
Очереди могут использоваться при обработке списков «работ» или некоторых задач, как разбор ввода текста в формируют список отдельных элементов, нормализуя его в одном цикле, а затем обрабатывают нормализованный список в другом.
Кучи
Кучи — это полные структуры двоичного дерева, которые должны удовлетворять свойству порядка кучи: каждый узел больше или равен данным, хранящимся в его дочерних элементах. Каждый уровень дерева полностью заполнен, за исключением, возможно, нижнего уровня (на этом уровне он заполняется слева направо).
SplHeap
SplMaxHeap
SplMinHeap
SplPriorityQueue
SplHeap
— это куча, представленная в виде бинарного дерева, каждый узел которого имеет не более двух дочерних узлов. Это абстрактный класс, требующий реализации метода compare()
, позволяющего выполнять сортировку в реальном времени при вставке новых узлов в дерево.
$heap = new \SplMaxHeap();
$heap->insert('111');
$heap->insert('222');
$heap->insert('333');
echo $heap->extract(); // 333
echo $heap->extract(); // 222
echo $heap->extract(); // 111
echo $heap->extract(); // Exception: Can't extract from an empty heap
$heap = new \SplMinHeap();
$heap->insert('111');
$heap->insert('222');
$heap->insert('333');
echo $heap->extract(); // 111
echo $heap->extract(); // 222
echo $heap->extract(); // 333
echo $heap->extract(); // Exception: Can't extract from an empty heap
SplMaxHeap
и SplMinHeap
являются конкретными реализациями абстрактного класса SplHeap
. SplMaxHeap
реализует метод compare()
, чтобы дерево сортировалось в порядке убывания значений узлов, а SplMinHeap
— в порядке возрастания значений.
SplPriorityQueue
— это очередь, похожая на SplHeap
, но в отличие от SplHeap
сортировка основана на значении свойства priority
, назначенного каждому узлу.
$queue = new \SplPriorityQueue(); $queue->setExtractFlags(SplPriorityQueue::EXTR_DATA); // extract only values of elements
$queue->insert('Q', 1); $queue->insert('W', 2); $queue->insert('E', 3); $queue->insert('R', 4); $queue->insert('T', 5); $queue->insert('Y', 6);
$queue->top();
while ($queue->valid()) { echo $queue->current(); $queue->next(); } //YTREWQ
Массивы
SplFixedArray
— это массив фиксированной длины, индексы которого могут быть только целыми числами (больше или равными 0). Эти ограничения обеспечивают более высокую скорость обработки массива, которая достигается, за счет того, что в SplFixedArray
отсутствует хэширование ключей элементов при их добавлении (в отличие от обычных массивов ). Длина может быть изменена, но это дорогостоящая операция.
карта
SplObjectStorage
— это хранилище объектов, которое предоставляет интерфейс для сопоставления объектов с данными или может использоваться в качестве контейнера для нескольких объектов. Позволяет использовать объект в качестве ключа ассоциативного массива и связывать его с некоторыми данными.
$storage = new \SplObjectStorage();
$o1 = new \stdClass(); $o2 = new \stdClass();
$storage->attach($o1);
var_dump($storage->contains($o1)); // bool(true) var_dump($storage->contains($o2)); // bool(false)
$storage->detach($o1);
var_dump($storage->contains($o1)); // bool(false) var_dump($storage->contains($o2)); // bool(false)
$storage = new \SplObjectStorage(); $object = new \stdClass(); $storage[$object] = "data from object"; echo $storage[$object]; // data from object
PHP — это не C. Это все, что вы должны помнить при работе с данными. Вы не можете ожидать, что супердинамический язык, такой как PHP, будет иметь такое же высокоэффективное использование памяти, как C. Но если вы хотите сэкономить память, вы можете рассмотреть возможность использования SPL для больших статических массивов.
Хотите узнать больше о PHP? Перейдите по этой ссылке, чтобы найти больше статей 😉