Функция list в php
(PHP 4, PHP 5, PHP 7, PHP 8)
list — Присваивает переменным из списка значения подобно массиву
Описание
До PHP 7.1.0, list() работала только с индексированными массивами и принимала числовые индексы начиная с 0.
Список параметров
Возвращаемые значения
Возвращает присвоенный массив.
Список изменений
Примеры
Пример #1 Примеры использования list()
Пример #2 Пример использования list()
Пример #3 Использование list() с индексами массивов
Пример #4 list() и порядок указания индексов
Производит такой вывод (обратите внимание, на порядок, в котором элементы были перечислены в синтаксисе list() и на порядок вывода):
Пример #5 list() с ключами
Начиная с PHP 7.1.0, для list() можно задавать конкретные ключи, которые могут быть произвольными выражениями. Допустимо смешивать строковые и числовые ключи. Однако элементы с ключами и без ключей не могут быть использоваться одновременно.
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 24 notes
Since PHP 7.1, keys can be specified
In PHP 7.1 we can do the following:
The example showing that:
One thing to note here is that if you define the array earlier, e.g.:
$a = [0, 0, 0];
the indexes will be kept in the correct order:
Thought that it was worth mentioning.
As noted, list() will give an error if the input array is too short. This can be avoided by array_merge()’ing in some default values. For example:
An alternate approach would be to use array_pad on the array to ensure its length (if all the defaults you need to add are the same).
list() can be used with foreach
The list construct seems to look for a sequential list of indexes rather taking elements in sequence. What that obscure statement means is that if you unset an element, list will not simply jump to the next element and assign that to the variable but will treat the missing element as a null or empty variable:
Since 7.1.0, you can use an array directly without list():
For PHP 7.1 on, the documentation states that integer and string keys can be mixed, but that elements with and without keys cannot. Here is an example, using data from getimagesize() with mixed keys:
As noted elsewhere, the list() operator can be written in array format:
I note this as contrasting with the fact that PHP triggers an E_NOTICE about «Undefined offset» «if there aren’t enough array elements to fill the list()», as attow documented for https://php.net/control-structures.foreach#control-structures.foreach.list and here only noted in https://php.net/function.list#122951 by Mardaneus.
Easy way to get actual date and time values in variables.
From PHP Version 7.1 you can specify keys in list(), or its new shorthand [] syntax. This enables destructuring of arrays with non-integer or non-sequential keys.
Since PHP 7.1 the [] may now be used as an alternative to the existing list() syntax:
This is something I haven’t seen in documentation.
Since PHP 7.1, you can use short-hand list unpacking using square brackets, just like short-hand array declaration:
Функция list в php
Пока я творю, я живу!
Блог посвящен: HTML, CSS, PHP, WordPress, Bootstrap
Полезные функции php List, Isset, Unset, Empty, Date, Count и Exit. Основы PHP с нуля. Урок №18
Всем привет!
Продолжаем изучать основы PHP с нуля!
В этом уроке я расскажу вам про некоторые полезные функции в php, такие как, List(), Isset(), empty(), Unset(), Date(), Count() и Exit(). Что это за функции и какую роль они играют, вы узнаете, если дальше продолжите читать этот урок.
Пойдем по порядку.
Функция list
Функция list () – позволяет присвоить значения переменным за одну операцию.
Пример (стандартный пример php-массива):
Пример (используя функцию list ()):
Обратите внимание на строки №5 и №6.
Функция Isset
Функция Isset () – эта функция поможет проверить, существует ли переменная в коде.
Функция Isset() часто используется для работы с формами, когда нужно проверить, существует ли переменная.
Функция Isset() работает вместе с конструкцией if else:
Функция empty
Функция empty() – проверка, пустая ли переменная.
Функции Unset
Функции Unset() – эта функция поможет удалить переменную.
Перед удалением: Мой блог StepkinBLOG.ru
После удаления:
Функция Date
Функция Date() – эта функция поможет вывести дату или время на сайте, которые берутся из сервера.
Основные параметры для date()
Попробуем вывести дату, месяц и год в таком формате « 24.01.2018 »
В таком формате 24/01/2018
Если еще хотите время добавить в таком формате « Дата:28/12/2017 Вр:14:38 », то вот так:
Вам на заметку:
Если вы хотите, чтобы на сайте автоматически менялась дата копирайта, то это можно сделать так:
Функции Count
Функции Count() – эта функция посчитает количество элементов массива.
Пример:
Создадим массив с 4 элементами:
Строка №7- выведет количество элементов массива:
Функция Exit
Функция Exit() – эта функция позволяет остановить дальнейшее выполнение скрипта.
Чтобы остановить дальнейшую работу скрипта, просто в коде прописываете функцию:
После этой функции прекращается чтение кода.
Можно в функцию exit() добавить текст:
Теперь пример:
Создам простой код без использования функции exit() :
Теперь я остановлю чтение скрипта после предложения «Всем привет. » (Строка № 3):
Как вы заметили, что код после функции exit() перестал читаться, это относиться и к тегам HTML, они тоже перестанут читаться.
Это все!
Жду вас на следующих уроках.
Битва со списками или применение классов для вывода списков в PHP
Список, список, список… Открываешь файл любого интернет-проекта, основанного на технологии php+mysql, и первое, что видишь — это куски кода, примерно такого вида:
Подобным образом выводится список ссылок на отдельные страницы раздела сайта, хранящиеся в базе данных, фирмы в каталоге, подписчики рассылки в интерфейсе администрирования, статистика ресурса и многое другое.
Каждый раз, набирая подобный код в php-редакторе, видишь, что снова и снова проделываешь одну и ту же работу с минимальными вариациями. Различия только в коде sql-запроса, типе и количестве выводимых полей и в html-тэгах, т.е. в дизайне. А если делаешь одну работу два раза, то это повод не только заскучать, но и задуматься о том, как ее себе облегчить. Да и попытки немного изменить дизайн сайта часто требуют модификации именно этого участка кода, а значит и его последующей отладки.
На протяжении нескольких лет работы с php у меня выработался определенный стандарт написания кода для вывода списков, и в результате захотелось обобщить этот опыт и сделать нечто стандартное, подходящее для любой ситуации, связанной с выводом результатов sql-запроса в виде списка средствами php.
В результате все простые списки были препарированы на шесть частей (это самая простая их модель):
Обрамление списка: это то, внутри чего список находится, есть в нем хотя бы один элемент или нет.
Пустой список: если наш запрос не возвращает ни одной строки, то все-таки стоит вывести на сайт некоторое пояснение, например, „список пуст”, или „редактор в отпуске, новостей больше не будет”, или оставить здесь пустое значение.
Начало списка: если в списке есть хотя бы один элемент, то список можно начать какой-нибудь фразой, например, „начало списка”, или разместить здесь заголовок, который в случае пустого списка может и не выводиться.
Конец списка: нужен для тех же целей, что и предыдущий пункт – фраза „конец списка” или какие-либо итоговые данные по всем строкам, которые в случае пустого списка могут и отсутствовать.
Элемент списка: собственно это и есть вывод данных каждой строки запроса; в отличие от предыдущих пунктов этот элемент применяется к каждой строке запроса, выводя её в одном и том же дизайне внутри обрамления списка.
Разделитель элементов списка: иногда элементы списка отделяются чем-нибудь друг от друга – запятыми, вертикальными черточками, тире и прочим, причем в начале и конце списка эти разделители могут отсутствовать.
Вышеуказанную структуру я называю шаблоном списка. Остается написать код некоего класса, который, имея на входе sql-запрос, порождает объект, содержащий результат выполнения этого запроса. В классе также требуется метод, который на основании разработанного выше шаблона выдаст нам требуемый html-код.
Можно, конечно, обойтись и функцией, которая выдаст требуемое, получив в качестве параметров sql-запрос и код шаблона. Но на мой взгляд с классами и ООП в программировании работать куда вкуснее. Вдобавок я не собираюсь останавливаться на такой простой модели списка, а дальнейшие разработки кода с классами поддерживаются куда проще. А когда наши провайдеры сменят движки php с четвертой версии на пятую, классы войдут в php в том же объеме, что и в c++.
Недолго думая, класс был назван listitems; незнакомых с английским отсылаю на multitran.ru. Пишем его код:
Конструктор класса принимает в качестве параметра код sql-запроса. К моменту создания экземпляра класса у вас уже должна быть вызвана функция mysql_connect. После этого в свойстве items объекта мы получим результат выполнения запроса в виде нумерованного массива, каждый элемент которого является стандартным php-объектом, имена полей которого соответствуют именам полей запроса, а значения, естественно, соответствуют выбранным из базы данных значениям полей.
Теперь немного о шаблоне списка. Списки я препарировал, но ничего не сказал об их программной реализации. Для начала назовем каждый пункт каким-нибудь малопонятным именем на английском языке.
list – обрамление списка
empty – пустой список
begin – начало списка
end – конец списка
item – элемент списка
delimiter – разделитель элементов списка
Потом создадим массив, в котором каждый элемент шаблона индексируется принятым именем. Для написания кода элементов шаблона я пользуюсь одной достаточно распространенной идеей, вымученной php-программистами (да и не только ими) за многолетние попытки отделить дизайн от кода (эта статья также относится к ним). В настоящее время сложился определенный стандарт написания шаблонов для php-программ, использующий так называемые макрокоды, или макросы.
Чаще всего применяется конструкция, использующая угловые скобки с каким-либо текстовым или цифровым значением внутри для указания того места в шаблоне, куда надо вставлять нужную информацию. Для той же цели применяются теги комментариев html с текстом или числом, которые идентифицируются php-движком и заменяются требуемой информацией.
На мой взгляд, главный недостаток такой технологии заключается в том, что если php по какой-либо причине не обработал этот элемент кода, то в браузере вы не увидите ничего, что указало бы на эту ошибку, поскольку комментарии html невидимы по определению, а конструкции с угловыми скобками выглядят для браузера как неизвестные ему html-тэги, которые также не отображаются. А если совершенная ошибка невидима, то она будет повторяться и никогда не отладится. К тому же шаблоны бывают достаточно сложны и объемны по содержанию и разрабатывать их приходится в каком-либо wisiwig-редакторе. Попробуйте редактировать невидимые тэги и комментарии в нем, и сразу убедитесь, насколько это неудобно. Применение квадратных скобок в виде [name] не очень удачно, так как даже в обычных текстах они достаточно распространены.
В общем, для вставки в шаблоны варьируемой информации была придумана следующая конструкция: <%%name%%>, где name – это идентификатор того значения, которым мы хотим заменить этот макрос. Такой макрос виден в выводе браузера, в любом wisiwig-редакторе, более того, многие популярные html- и php-редакторы исходного кода можно настроить на подсветку этой конструкции цветом, отличным от остального кода, поскольку в стандарте html и php такая последовательность символов не используется. К тому же этот макрос не требует для своего написания специальных символов html.
Идентификатор name должен подчиняться еще одному правилу. Как вы уже заметили, в коде класса listitems, sql-запрос преобразуется в массив объектов, у которых имена полей соответствуют именам полей запроса, а значения – значениям. Распространяя это дальше, примем, что идентификатор name должен соответствовать имени того поля, значение которого заменит макрос без учета регистра символов. То есть, если в вашей базе данных есть таблица, в которой в поле name содержатся названия стран мира, а в поле population – численность их населения, то для того чтобы вывести список стран в виде
НАЗВАНИЕ СТРАНЫ – НАСЕЛЕНИЕ
элемент item должен выглядеть так:
<%%name%%>– <%%population%%>чел.
Чтобы указать, где в обрамлении списка выводится последовательность его элементов, а также их количество, в классе listitems предусмотрены дополнительные поля и соответствующие им макросы.
listitems – в этом поле накапливается html-вывод по мере перебора элементов списка, а макрос <%%listitems%%>должен обязательно присутствовать в элементе list шаблона, поскольку он заменяется кодом всего списка.
count – это число элементов списка, а макрос <%%count%%>заменяется значением этого поля.
С учетом вышесказанного, код, задающий шаблон, будет выглядеть так:
Функция list в php
Обратиться к элементу массива можно по имени массива и индексу элемента внутри массива:
Зная количество элементов массива, можно вывести все элементы массива с помощью цикла:
если неизвестно количество элементов массива, можно использовать функцию count(). Эта стандартная функция определяет размер массива, то есть количество элементов в нем. Соответственно:
Массивы, индексами которых являются числа, начинающиеся с нуля без пропусков, называются списками. С технической точки зрения разницы между массивами и списками нет.
Массивы, индексами которых являются строки, называются ассоциативными. Индексы ассоциативных массивов называются ключами. Например:
$people[» Иванов «] = » Иван «;
$people[» Сидоров «] = » Николай «;
$people[» Петров «] = » Петр «;
Доступ к элементам ассоциативных массивов осуществляется так же, как и к элементам обыкновенных массивов, и называется доступом по ключу:
Пример: имеем массив, состоящий из трех элементов:
Инструкция array() используется специально для создания массивов. При этом она позволяет создавать пустые массивы.
Методы использования инструкции array() :
$A = array (); // создает пустой массив
$A = array (» Иванов «=>» Иван «, » Петров «=>» Петр «); // создает ассоциативный массив с двумя элементами
$A = array (» Иванов «,» Петров «); // создает список с двумя элементами. Индексы нумеруются с нуля.
Инструкцию array() удобно использовать при создании многомерных массивов.
$A[«Ivanov»] = array(«name»=>» Иванов И. «, «sex»=>» М «, «email»=>»ivanov@mail.ru»);
$A[«Petrov»] = array(«name»=>» Петров И. «, «sex»=>» М «, «email»=>»petrov@mail.ru»);
$A[«Sidorova»] = array(«name»=>» Сидорова Н. «, «sex»=>»F», «email»=>»sidorova@mail.ru»);
Добраться до элементов массива можно так:
Для удаления массива, как и любой переменной, используется функция UnSet():
Пример: имеется два массива.
$A = array («1″=>» первый «,»2″=>» второй «);
$B = array(«3″=>» третий «,»4″=>» четвертый «);
«1»=>» первый «,»2″=>» второй «,»3″=>» третий «,»4″=>» четвертый » // именно в таком порядке
Особенно внимательными нужно быть при слиянии списков. Пример:
В результате: 10,11,12 т. к. при слиянии массивов, в которых содержатся элементы с одинаковыми индексами (ключами), в результирующем массиве останется элемент первого массива, причем на том же самом месте.
Функция array_merge() предназначена для слияния массивов. Она устраняет все недостатки оператора +.
Функция array_merge() соединяет массивы переданные ей в качестве аргументов в один большой массив. Если в соединяемых массивах встречаются одинаковые ключи (ключ= > значение), то в результирующий массив помещается пара ключ= > значение из массива, который стоит правее в списке аргументов функции array-merge().
Таким образом, функцию array_merge() очень удобно использовать для слияния списков.
Принцип косвенного перебора заключается в том, что сначала вычисляется очередной индекс (ключ), а затем по этому индексу косвенно находится значение элемента массива. Например:
Пояснения: цикл for перебрал индексы ( целые числа), последовательно увеличивая их на 1, и по индексам получил элементы массива.
Для ассоциативного массива, индексом которого является строка:
$people[» Иванов «] = » Иван «;
$people[» Сидоров «] = » Николай «;
$people[» Петров «] = » Петр «;
Перебор такого массива поможет следующий цикл:
for (Reset($people); ($k = key($people)); Next ($people));
Принцип прямого перебора заключается в том, чтобы при каждой итерации цикла одновременно получать и ключ, и значение текущего элемента массива. для прямого перебора используется цикл foreach :
Основные функции для сортировки массивов:
Функция asort() выполняет сортировку массива по значениям элементов. При этом она располагает элементы массива таким образом, что их значения идут в алфавитном порядке (если это строки) или в возрастающем порядке (если это числа).
Функция arsort() выполняет сортировку в обратном порядке.
Пример: имеется массив
$FIO = array(«Sidorov»=>»Nikolay», «Ivanov»=>»Alexandr», «Petrov»=>»Petr»);
После выполнения функции asort($FIO) массив будет преобразован следующим образом:
array(«Ivanov»=>»Alexandr», «Sidorov»=>»Nikolay», «Petrov»=>»Petr»);
array(«Ivanov»=>»Alexandr», «Petrov»=>»Petr», «Sidorov»=>»Nikolay»);
Для сортировки ключей в обратном порядке используется функция krsort().
Функции asort(), arsort(), ksort() и krsort() не разрывают пары ключ= > значение. Это очень важно. Например: имеем небольшой список:
$people = array(«Ivanov»=>»555-6677», «Sidorov»=>»345-4567», «Petrov»=>»777-5653»);
после сортировки массива по ключам, список выглядит так:
$people = array(«Ivanov»=>»555-6677», «Petrov»=>»777-5653», «Sidorov»=>»345-4567»);
Пары ключ= > значение не разорваны. Если необходимо отсортировать список, то удобнее использовать функцию sort(). Данная функция разрывает пары ключ= > значение, поэтому она используется только для списков. Например: имеется список
$List = array(«Name», «Address», «Email»);
Если вывести список в виде ключ= > значение, получим следующий результат:
После сортировки sort() имеем следующий список:
Для переворачивания массива используется функция array_reverce(). Она возвращает массив в обратном порядке относительно исходного массива. Например, чтобы отсортировать массив в обратном порядке, можно использовать функцию arsort(), а можно упорядочить массив в прямом порядке функцией asort() и перевернуть его функцией array_reverce().
Перед вызовом этой функции необходимо инициализировать генератор случайных чисел, иначе при каждом новом вызове функции shiffle() результат перемешивания будет один и тот же. Для инициализации генератора случайных чисел используется функция mt_srand():
// Сравниваем по алфавиту
elseif ($e1_1>$e1_2) return 1;
Вызовем функцию uasort():
Для получения части массива используется функция array_slice(). Ей нужно передать три параметра:
Данная функция возвращает часть указанного массива, начиная с указанного смещения от начала массива. Выборка элементов осуществляется подряд. Длина результирующего массива задается параметром Длина, который является необязательным. Если он не указан, то выборка элементов проходит до конца исходного массива.
$A = array (xox, ror, tot, pop, mom); // задаем исходный массив
$A = array («Audi», «Mersedes», «Toyota», «Honda», «Renault»);
array_splice ($A, 1, count($A), «BMW»);
Если необходимо добавить один элемент в массив (как в приведенном примере), то удобнее использовать оператор [ ]. Использование оператора array_push() оправдывает себя тогда, когда нужно добавить в конец массива несколько новых элементов. Например:
Вместо этого можно записать:
array_push ($A, 5,7,9,10,15);
$A = array (xox, ror, tot, pop, mom);
Функции array_unshift() и array_shift() похожи на функции array_push() и array_pop(), но только работают не с концом списка, а с его началом.
Функция array_unshift() добавляет элементы в начало списка, а функция array_shift() возвращает значение первого элемента списка и удаляет его из списка:
Функция array_unique() предназначена для извлечения уникальных значений массива вместе с ключами этих значений. Пример:
$Arr = array («a=>»AAA», «b»=>»BBB», «c», «d», «e»=»BBB», «d»);
$Unique_Arr = array_unque ($Arr); //$Unique_Arr = array («a»=>»AAA», «b»=»BBB», «c»,»d»);
Функция compact(«Name», «Email») упакует переменные в один массив:
$A = compact («Name», «Email»);
Значение EXTR_WRITE используется по умолчанию и может не указываться, т.е. достаточно указать extract($A) и все переменные будут перезаписаны.
Иногда нужно создать диапазон чисел, например, для нумерации записей в выбранной таблице. Пример создания диапазона чисел:
Эффективные структуры данных для PHP 7
Последний релиз PHP вызвал большое оживление в сообществе. Мы не могли дождаться того, чтобы начать использовать новые возможности и почувствовать вкус
2х прироста производительности. Одна из причин, почему это случилось — структура array была переработана. Но массивы все также придерживаются принципа «оптимизировано для всего; оптимизировано для ничего», еще не все идеально, есть возможности для совершенствования.
К сожалению… они ужасны. Раньше, до PHP7, они предлагали _некоторые_ преимущества, но сейчас мы дошли до точки, когда использование SPL не имеет практического смысла.
Почему мы не можем просто поправить и улучшить их?
Введение: php-ds — расширение для PHP7, добавляющее структуры данных. Этот пост кратко охватывает поведение, производительность и преимущества каждой из них. Также в конце вы найдете список ответов на ожидаемые вопросы.
Collection (Коллекция)
Sequence (Последовательность)
Варианты использования
Vector (Вектор)
Сильные стороны
Недостатки
Структурой номер один в Photoshop были Вектора.
— Sean Parent, CppCon 2015
Deque (Двусвязная очередь)
Два указателя используется для отслеживания головы и хвоста. Наличие указателей позволяет изменять конец и начало буфера без необходимости перемещать другие элементы для освобождения места. Это делает shift и unshift настолько быстрым, что даже Vector не может конкурировать с этим.
Сильные стороны
Недостатки
SplDoublyLinkedList выделяет память для каждого значения по отдельности, поэтому и происходит ожидаемый рост по памяти. array и Ds\Deque при своей реализации выделяют память порционно для поддержания достаточного объема для 2ⁿ элементов. Ds\Vector имеет фактор роста 1.5, что влечет за собой увеличение количества выделений памяти, но меньший расход в целом.
Следующий бенчмарк показывает время, затраченное на unshift единственного элемента в последовательности значений размером 2ⁿ. Время, требующееся на установку значений не учитывается.
На следующем тесте видно сколько памяти используется при 2ⁿ pop операций. Другими словами при изменении размера от 2ⁿ до нуля
Интересно тут то, что array всегда держит выделенную память, даже если его размер существенно уменьшается. Ds\Vector and Ds\Deque позволяют в два раза уменьшить выделяемые ресурсы, если их размер падает ниже четверти своего текущего потенциала. SplDoublyLinkedList освобождает память после каждого удаления из выборки, поэтому мы можем наблюдать линейное снижение.
Stack (Стек)
Стек — является коллекцией, организованной по принципу «последним пришёл — первым вышел» или «LIFO» (last in — first out), позволяющей получить доступ только к значению на вершине структуры. Вы можете думать о нем как об оружейном магазине с динамической емкостью.
Queue (Очередь)
Очередь — тип данных с парадигмой доступа к элементам «первый пришел — первый вышел» («FIFO», «First In — First Out»). Такая коллекция позволяет получить доступ к элементам в порядке их добавления. Ее название говорит само за себя, представьте себе структуру как линию людей, стоящих в очереди на кассу в магазине.
PriorityQueue (Очередь с приоритетом)
Реализация очереди с приоритетом использует max-heap.
Принцип «первый пришел — первый вышел» сохраняется для значений с одинаковым приоритетом, так что группа значений с равным приоритетом можно рассматривать как обычную очередь.
А что же с производительностью? Следующий бенчмарк показывает время и память, требующиеся для операции push 2ⁿ случайных чисел со случайным приоритетом в очередь. Те же случайные числа будут использоваться для каждого из тестов. В тесте для Queue также генерируется случайный приоритет, хотя он и не используется.
Это, наверное, самый значимый из всех бенчмарков. Ds\PriorityQueue работает более чем в два раза быстрее чем SplPriorityQueue и использует только 5% от его памяти — это в 20 раз более эффективное решение по памяти.
Но как? Как может получиться настолько большая разница, когда SplPriorityQueue использует аналогичную внутреннюю структуру? Все сводится к тому, как хранятся значения в паре с приоритетом. SplPriorityQueue позволяет использовать любой тип значения для использования в качестве переменной, это приводит к тому, что в каждой паре приоритет занимает 32 байта.
Ds\PriorityQueue поддерживает только целочисленные приоритеты, поэтому каждой паре выделяется 24 байта. Но это все еще недостаточная разница для объяснения результата.
Т.к. массив имеет минимальную емкость 8, то для каждой пары на самом деле выделяется zval + HashTable + 8 * (Bucket + hash) + 2 * zend_string + (8 + 16) byte string payloads = 16 + 56 + 36 * 8 + 2 * 24 + 8 + 16 = 432 байта (64 бит).
«Так… почему же массив?»
Hashable
Map (Ассоциативный массив)
Map является последовательной коллекцией пар ключ-значение, практически идентичной array в аналогичном контексте. Ключи могут быть любого типа, единственное условие — уникальность. При повторном добавлении ключа значения заменяются.
Сильные стороны
Недостатки
Set (Множество)
Сильные стороны
Недостатки
Ответы на ожидаемые вопросы и мнения
Есть ли тесты?
Сейчас около 2600 тестов. Вполне возможно, что некоторые тесты являются избыточными, но я предпочел бы косвенно проверить одну и ту же вещь дважды, чем не проверять совсем.
Документация? Справочник по API?
На момент написания этой статьи пока еще нет полной документации, но она появится вместе с первым стабильным релизом.
Можем ли мы посмотреть как устроены бенчмарки? Есть что-то о них?
Все бенчмарки прогонялись на стандартном билде PHP 7.0.3 на 2015 Macbook Pro. Результаты могут отличаться в зависимости от версии и платформы.
Я не верю, что есть необходимость в какой-либо альтернативной реализации. 3 интерфейса и 7 классов — это хороший баланс между прагматизмом и специализацией.
Почему все классы являются финализированными?
Дизайн API php-ds применяет парадигму «Composition over inheritance.
Просто потому, что эти структуры имеют непересекающиеся методы не значит, что мы не можем так делать.
Наследование также вызвало бы лишние сложности во внутренней реализации.
Зачем нужен еще и ds класс в глобальном пространстве имен?
Почему нет связного списка (Linked List)?
Класс LinkedList на самом деле появился первым, это казалось хорошим стартом. Но в итоге я решил удалить его, когда понял, что он не сможет конкурировать с Vector или Deque при любом раскладе. Две основные причины возможной поддержки: распределение накладных расходов и локальность ссылок.
Будет ли связный список использовать меньше памяти, т.к. там нет буфера?
Окей… связный список использует больше памяти, но почему он медленный?
Узлы связного списка обладают плохой пространственной локальность. Это означает, что физическое расположение узла в памяти может быть далеко от прилегающих узлов. Таким образом итерации по связному списку скачут по памяти вместо использования кэша процессора. Значительное преимущество Vector и Deque : элементы физически находятся рядом друг с другом.
PHP — это язык для веб-разработки — производительность не важна.
Производительность не должна быть вашим главным приоритетом. Код должен быть последовательным, ремонтопригодным, надежным, предсказуемым, безопасным и легко понимаемым. Но это не означает, что производительность «не важна».
Мы тратим много времени, пытаясь уменьшить размер своих ассетов, делаем сравнительный анализ фреймворков и придумываем бессмысленные микро-оптимизации:

