2010-07-02 2 views
6

В java и C++, когда мы не знаем размер - массив не используется как в PHP, вместо этого используется связанныйList и т. Д.SPL против массива: когда мы должны использовать SPL и когда мы должны использовать Array в PHP?

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

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

+0

Связанные: [В чем преимущества использования SPL ArrayObject, ArrayIterator, RecursiveArrayIterator вместо обычных массивов?] (Http://stackoverflow.com/questions/4072927/what-are-the-benefits-of-using-spl -arrayobject-arrayiterator-recursivearrayite) (ноябрь 2010 г.); [Преимущества интерфейса ArrayAccess в PHP?] (Http://stackoverflow.com/q/4319603/367456) (ноябрь 2010 г.) – hakre

ответ

2

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

Отличие от 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[][]=5; 

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

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

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

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

+0

dinamic php array означает, что каждый раз, когда новый элемент вставлен, создается новый массив. Или, например, php-массив имеет размер по умолчанию, равный 100 ячейкам, и она увеличивается, если для массива требуется более 100 ячеек, умножая 2 и т. Д. ?? – Yosef

+0

Каждый раз, когда создается новый элемент, выделяется новая память для переменной и выделяется новая память для хеша. – codez

1

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

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

+4

Почему «это медленнее» всегда должно быть первым аргументом против чего-то? – salathe

+1

http://www.php.net/manual/pt_BR/class.arrayobject.php#90371 проверить этот комментарий для теста. Извините, производительность - очень важный параметр в тяжелом приложении. – silent

2

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

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

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

+0

Я думаю, что я немного испортил avout SPL – Yosef

0

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

, а затем существуют SplDoublyLinkedList, SplQueue, SplHeap. плюс ArrayObject.

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

SPL, вообще говоря, является предварительным, чтобы имитировать стандартные & «вне-Шельф» классов & API, как существует в C++ & Java.

ИМХО это пришло слишком поздно.