На ниво PHP масивът е подреден списък, който се съпоставя с карта. С други думи, PHP просто комбинира тези две понятия, което води до доста гъвкава, но, от друга страна, не най-оптималната структура на данните в сравнение с подобни опции.
Малко хора знаят, че на ниво С (и всъщност на системно ниво) няма масиви, които биха могли да имат нефиксиран размер. По този начин, ако ще създадете масив в C, то определено ще трябва да укажете неговия размер, за да може системата да определи колко свободно място трябва да разпределите за него.
В PHP сортирането на масив е далеч от това да бъде същото като в други хранилища на данни, тук е подредено преобразуване, което определя съответствието между ключ и определена стойност. Този тип масив е оптимизиран в няколко различни посоки, което ви позволява активно да го използвате директно като масив, както и речник, лекция, хеш таблица, както и за редица други цели, по ваша преценка. Трябва да се отбележи, че в случая с PHP стойността в масива може да бъде друг подобен масив. Това ви позволява да формирате дървета, както и многомерно съхранение.
Сред отличителните черти на това хранилище е да се отбележи колко лесно е да се премахне масив в PHP. Всъщност в този случай процедурата е много по-проста, отколкото в подобни файлови системи.
Ако ще създадете напълно празен масив, тогава в този случай PHP масивът се създава със специфичен размер. Ако този том е запълнен и впоследствие решите да надвишите този размер, тогава ще бъде създаден напълно нов масив с обем два пъти размера на съществуващия и всички данни ще бъдат копирани в него, докато старият масив ще бъде напълно унищожен. Този подход е стандартен.
Всъщност, за да се приложи PHP масив, се използва традиционна структура на данните, наречена Hash Table. Тази структура включва указател към последната и първата стойност, която е необходима за подреждане на масиви, както и указател към текущата стойност, която се използва за осигуряване на итерация над масива. Освен това таблицата с хеш съдържа броя на елементите, съхранени в масив, масив указатели към кофата и други важни данни.
Хеш таблицата има две важни характеристики - тя е самата структура на данните, както и кофата (кофата).
Кофите съхраняват самите стойности, т.е. всеки от тях има своя собствена кофа, но освен това съдържа и оригиналния ключ, както и различни указатели към предишни или следващи кофи, които се използват за организиране на създадения масив, както в PHP Клавишите могат да бъдат в различен ред, в зависимост от желанията на потребителя.
По този начин, ако искате да добавите някакъв нов елемент към масива, но този ключ все още не е там, под него автоматично ще се създаде нова кофа, която ще бъде добавена към таблицата с хешовете. И в този случай трябва правилно да разберете как многомерният PHP масив ще съхранява тези кофи.
Както бе споменато по-горе, системата има специализиран масив от указатели към кофи, като всеки кофа има достъп чрез специфичен индекс, който се определя чрез ключ. Звучи често доста трудно, но в действителност всичко е малко по-просто, отколкото изглежда. По този начин ключът може да се получи, както следва:
За маската: например масивът от данни съдържа четири различни елемента, след което маската ще бъде равна на три. Сега, ако като ключ получавате число като 123, то в този случай, след прилагане на маската, 3 ще бъдат получени и този номер вече може да се използва като индекс.
Кофите имат няколко важни функции, които трябва да знаете. Всяка кофа има указател към следващия и предишния, с еднакви индекси. По този начин, в допълнение към основния двойно свързан списък, преминаващ през всички използвани кофи, има и два малки двойно свързани списъка между кофите, имащи еднакъв индекс.
Какво се случва, след като използваният масив е напълно пълен, се нарича rehash сред специалистите. По същество това е итерация върху всички използвани кофи, както и възлагането на техните съседи и добавянето на връзки към тях.
Процедурата първоначално е същата като при получаване на ключ, но в този случай има продължение:
Такива действия трябва да се повтарят, докато кофите изцяло не излязат от pNext или докато не намерите съвпадение, което ви интересува.
Заслужава да се отбележи, че многоизмерният PHP масив е почти изцяло изграден върху една единствена HashTable структура, тъй като всички променливи, които са в конкретен обхват, са всъщност в тази структура от данни, разкъсани като методи, полета и дефиниции на класове. Освен това, тази структура на данните позволява да се постигне почти еднаква скорост на всички операции и в същото време ги прави много по-прости в изпълнението.
Масив се създава с помощта на масив конструкция на език, който може да отнеме произволен брой двойки ключ => стойност, разделени със запетаи като параметри.
Ключът в този случай може да бъде низ или цяло число. Ако ключът е стандартно цяло число, тогава той ще се интерпретира в този случай, докато флоатът ще бъде изрязан до този формат. Струва си да се отбележи, че в PHP сортирането на масив не осигурява никаква разлика между асоциативните и индексни масиви, т.е. има само един тип хранилище, който съдържа както низ, така и числови индекси.
За нормална работа с масиви са осигурени достатъчно голям брой различни функции, но не всички от тях знаят и могат да ги използват. По-специално, специално внимание трябва да се обърне на такава функция като unset, която ви позволява напълно да премахнете ключовете, които елемент от масив има в PHP. Ако искате да извършите действие в стила "премахване и преместване", тогава масивът може да се преиндексира чрез array_values.
Структурата за управление на foreach е специално създадена за работа с масиви. Тази функция се използва за лесно преглеждане на съдържанието на масива и взаимодействие с данните.
При деклариране на индексиран PHP масив, след като е зададено името на променливата, се задава и двойка квадратни скоби, в която позицията на дадения масив се посочва директно. Има и няколко основни команди, които трябва да знаете, когато създавате този масив:
Във всеки случай, струнният литерал трябва да бъде затворен в кавички в индекса на асоциативен масив. Доста често можете да намерите синтаксис в стари скриптове, в които няма кавички и това може да работи, въпреки че е неправилно. В този случай причината е, че този код съдържа неопределена константа вместо низ, в резултат на което в PHP изходът на масива може да бъде такъв, че “голата линия” да може автоматично да се преобразува в пълен низ с подходяща стойност. С други думи, ако първоначално не беше възможно да се определи зададената константа, PHP ще добави кавички самостоятелно, а след това ще използва правилно въведения низ.
Трябва да се отбележи, че не винаги е необходимо ключовете да се поставят в кавички. Например, няма нужда да включвате променливи или константи в кавички, тъй като в този случай изходът от масив в PHP може да е неправилен и тези команди ще бъдат неправилно обработени.
Ако в бъдеще екипът за разработване на PHP реши да добави нова ключова дума или допълнителна константа, може да имате проблеми. Същото се отнася и за ситуацията, ако константа от друг код се намесва в масива ви. Например, може да не можете да използвате думи като по подразбиране и празни, тъй като те са запазени ключове.
За всеки от ключовите типове, преобразуването на стойността в PHP масиви, функциите на които потребителят сам избира, в крайна сметка осигурява възможността да се получи масив с единичен елемент, имащ скаларна стойност.
Ако решите да конвертирате обект в масив, тогава в този случай свойствата на този обект ще се използват като елементи на този масив. След като решите как да изведете масива в PHP, имената на свойствата на обекта с определени забележителни изключения ще се използват като ключове:
Всички тези добавени стойности имат нулеви байтове от двете страни, което често може да предизвика малко неочаквано поведение на масива за неговия собственик.
Както можете да видите, използването на такива масиви е изключително лесно за напреднали потребители и, което е по-важно, те са изключително удобни при използването им. Никой голям проект не може да бъде представен без използването на различни типове масиви, като в същото време се опитахме да разгледаме само част от характеристиките и наличните функции на такива системи, без да навлизаме във всякакви тънкости на това как те могат да бъдат използвани в различни ситуации.