SPL против Array: когда мы должны использовать SPL и когда мы должны использовать Array в PHP?

В java и C++, когда мы не знаем размер - массив не используется, как в PHP, вместо этого используется linkedList и т.д.

В PHP существует SPL, но в большинстве случаев программисты используют массив, почему (потому что люди не знают о SPL)?

Когда мы должны использовать Array в PHP и когда SPL, и какая разница в этом случае между PHP и Java/C++?


person Ben    schedule 02.07.2010    source источник


Ответы (4)


Каждый запрос PHP должен инициализировать все переменные и после запроса они освобождаются. Из-за этого не часто возникают ситуации, когда специальные структуры данных (такие как maxheap, linkedlist или очередь) более эффективны, чем массив. Также массивы намного проще понять и использовать для новичков.

Отличие от C++ в PHP в том, что длина массивов является динамической. Вы можете добавлять элементы в любое время.

$arr=array();
$arr[]=5; //add integer to array
echo count($arr); //1
$arr[]=7;
echo count($arr); //2

вы можете динамически создавать и добавлять массив в другой массив

$arr[]=array();
$arr[2][]=5;
echo count($arr); //3
echo count($arr[2]); //1

Это создаст новый массив, добавит элемент со значением 5 и добавит его как элемент в массив $arr.

$arr[][]=5;

В PHP массивы — это хеш-таблицы, поэтому у вас могут быть не только целочисленные ключи, но и строки:

$arr['somekey']='somevalue';

Если элемент массива целочисленный, то для каждого элемента требуется структура значения (zval), которая занимает 16 байт. Также требуется хеш-ведро, которое занимает 36 байт. Это дает 52 байта на значение. Заголовки выделения памяти занимают еще 8 байт*2, что дает 68 байт.

О массивах в PHP: http://oreilly.com/catalog/progphp/chapter/ch05.html

person codez    schedule 02.07.2010
comment
динамический массив php означает, что каждый раз, когда вставляется новый элемент, создается новый массив. Или, например, массив php имеет размер по умолчанию, например 100 ячеек, и она увеличивается, если массиву требуется более 100 ячеек, умножая на 2 и т. Д.?? - person Ben; 02.07.2010
comment
Каждый раз, когда создается новый элемент, выделяется новая память для переменной и выделяется новая память для хэша. - person codez; 02.07.2010

Вы просите нас сравнить две очень разные вещи, почти единственное сходство в том, что они обе (массивы и SPL) доступны в PHP.

С этой целью было бы по существу бессмысленно сравнивать напрямую или предписывать, когда один из них следует использовать вместо другого в случаях, когда оба могут использоваться для выполнения задачи. В этом примечании оба могут использоваться взаимосвязано: например, использование ArrayIterator для перебора массива или ArrayObject для использования синтаксиса в стиле массива при работе с объектами.

Вы также, кажется, сбиты с толку или просто не понимаете, что такое SPL; он, конечно же, не ограничивается инструментами, используемыми для перебора коллекций вещей. Вы хотели спросить о конкретных частях библиотеки или, возможно, вам просто неясно, что в ней доступно?

person salathe    schedule 02.07.2010
comment
Я думаю, что немного путаюсь в SPL - person Ben; 03.07.2010

Используйте стандартные массивы, это быстрее, чем ArrayObject.

Используйте ArrayObject только для реализации ваших собственных указанных массивов с помощью ваших пользовательских методов.

person silent    schedule 02.07.2010
comment
Почему медленнее всегда должно быть первым аргументом против чего-то? - person salathe; 02.07.2010
comment
php.net/manual/pt_BR/class.arrayobject.php#90371 проверьте этот комментарий для эталона. Производительность - очень важный параметр в тяжелом приложении, извините. - person silent; 03.07.2010

Возможно, это не обязательно путаница, потому что люди могут решить использовать «SplStack» вместо ванильного массива, связанного с функциями array_push/pop. Или используйте массивы классическим способом,

а затем существуют SplDoublyLinkedList, SplQueue, SplHeap. плюс объект массива.

Так что вопрос актуален. И ответ таков: вы делаете то же самое более явным способом, и это медленнее.

Вообще говоря, SPL является предварительным для имитации стандартных и «готовых» классов и API, подобных тем, которые существуют в C ++ и Java.

ИМХО поздновато.

person Nadir    schedule 19.08.2014