PHP-масив: функції і значення

PHP-масив: функції і значення

На рівні PHP масив - це впорядкований список, який схрещений з мепом. Іншими словами, PHP просто об 'єднує ці два поняття, внаслідок чого утворюється досить гнучка, але, з іншого боку, не найоптимальніша структура даних, якщо порівнювати її з аналогічними варіантами.

Мало хто знає про те, що на рівні С (та й на системному рівні) не існує масивів, які могли б мати нефіксований розмір. Таким чином, якщо ви збираєтеся створити масив в С, вам в обов 'язковому порядку потрібно буде вказати його розмір для того, щоб система могла визначити, яку кількість вільного місця потрібно буде виділити для нього.

Що таке PHP-масив?

У PHP сортування масиву далеко не так, як в інших сховищах даних, тут воно є впорядкованим відображенням, яким визначається відповідність між ключем і певним значенням. Цей тип масиву є оптимізованим у декількох різних напрямках, що дозволяє вам його активно використовувати безпосередньо в якості самого масиву, а також словника, лекції, хеш-таблиці, а також ще в цілому ряді інших цілей на ваш розсуд. При цьому варто відзначити, що у випадку з PHP значення в масиві може являти собою інший аналогічний масив. Це дозволяє формувати дерева, а також багатовимірні сховища.

Серед відмінних особливостей цього сховища варто відзначити, наскільки легко в PHP видалити масив. Адже в цьому випадку процедура набагато простіша, ніж в аналогічних файлових системах.

Як це реалізовано у PHP?

Якщо ви збираєтеся створити повністю порожній масив, то в такому випадку PHP-масив створюється з певним розміром. Якщо цей обсяг буде заповнений, і згодом ви вирішите перевищити даний розмір, то в такому випадку буде створено абсолютно новий масив, що має обсяг в два рази більше існуючого, і всі дані будуть скопійовані в нього, в той час як старий масив буде повністю знищений. Такий підхід є стандартним.

Насправді ж для того, щоб реалізувати PHP-масив, застосовується традиційна структура даних під назвою Hash Table. Дана структура включає в себе покажчик на останнє і перше значення, що є необхідним для впорядкування масивів, а також покажчик на поточне значення, який застосовується для того, щоб забезпечити ітерацію по масиву. Крім цього в Hash Table міститься кількість елементів, що зберігаються в масиві, масив покажчиків на Bucket та інші важливі дані.

Чому Hash Table?

Hash Table має дві важливі особливості - це безпосередньо сама структура даних, а також Bucket (відро).

Відра зберігають в собі безпосередньо самі значення, тобто для кожного з них передбачається своє відро, проте крім цього в ньому присутній також оригінал ключа, а також різні покажчики на попередні або ж наступні відра, які використовуються для впорядкування створеного масиву, оскільки в PHP ключі можуть йти в різному порядку, залежно від побажань користувача.


Таким чином, якщо ви хочете додати в масив якийсь новий елемент, а даного ключа там ще немає, під нього буде автоматично створено нове відро, яке буде додано в Hash Table. І в даному випадку потрібно правильно розуміти, як багатовимірний масив PHP буде зберігати ці відра.

Як отримати ключ?

Як було зазначено вище, система має спеціалізований масив покажчиків на відра, при цьому кожне відро має доступ через певний індекс, який визначається через ключ. Звучить часто досить складно, але насправді все дещо простіше, ніж здається. Таким чином, ключ можна отримати наступним чином:

  • якщо ключ є рядковим, у такому випадку здійснюється хешування рядка аж до integer;
  • на отриманий ключ накладається маска, яка є рівною розміру масиву мінус 1;
  • у кінцевому підсумку цей ключ може використовуватися як індекс для того, щоб визначити потрібний покажчик на відро з масиву.

Про маску: наприклад, у масиві даних міститься чотири різні елементи, тоді маска дорівнюватиме трьом. Тепер, якщо в якості ключа у вас виходить число на зразок 123, то в такому випадку після накладення маски буде отримано 3, і дане число вже може використовуватися в якості індексу.

Як вчинити з колізіями?

У відер є ще пара важливих особливостей, які потрібно знати. Кожне відро має покажчик на наступне і попереднє, що мають рівні індекси. Таким чином, крім головного двозв 'язкового списку, що проходить через всі використовувані відра, існує також два дрібних двозв' язкових списку між відрами, що мають рівний індекс.

Те, що відбувається після того, як буде повністю переповнений використовуваний масив, серед фахівців прийнято називати rehash. По суті, це являє собою ітерування за всіма використовуваними відрами, а також призначення їх сусідів і додавання на них посилань.

Як отримати елемент за ключем?

Процедура є спочатку такою ж, як і у випадку з отриманням ключа, але в даному випадку є продовження:

  • У разі якщо ключ рядковий, здійснюється хешування рядка до integer.
  • Після отримання числового ключа накладається маска, яка є постійно рівною розміру масиву.
  • За індексом витягується відро.
  • Якщо ключ даного відра є рівним тому, що ви шукаєте, то в такому випадку пошук завершено. Якщо ні, діємо далі.
  • У отриманому циклі береться відро з pNext, після чого дивіться, чи дорівнює ключ необхідному.

Такі дії потрібно повторювати аж до того, поки в pNext повністю не закінчаться відра або ж поки ви не знайдете цікавий вас збіг.


Варто відзначити, що багатовимірний масив PHP практично повністю побудований на єдиній структурі HashTable, оскільки всі змінні, які знаходяться в тому чи іншому scope, насправді ж знаходяться саме в цій структурі даних, рвано як методи, поля і дефінішини класів. Крім усього іншого дана структура даних дозволяє домогтися практично однакової швидкості проведення всіх операцій і при цьому робить їх набагато більш простими у виконанні.

Визначення через array

Масив створюється за допомогою мовної конструкції array, яка в якості параметрів може приймати будь-яку кількість пар key = > value, розділених між собою комами.

Ключ може бути string або integer. Якщо ключ є стандартним виконанням integer, він так і інтерпретується, тоді як float обрізається до цього формату. Варто зазначити, що в PHP сортування масиву не передбачає жодної різниці між асоціативними та індексними масивами, тобто існує єдиний тип сховища, в якому містяться як рядкові, так і числові індекси.

Корисні функції

Для нормальної роботи з масивами передбачається досить велика кількість різних функцій, проте не всі їх знають і вміють ними користуватися. Зокрема, окрему увагу слід приділити такій функції, як unset, що дозволяє повністю видаляти ключі, які має в PHP елемент масиву. Якщо ж ви хочете здійснити дію в стилі "видалити і зрушити", то в такому випадку може бути проведена переіндексація масиву через array_values.

Керуюча конструкція foreach спеціально створювалася для роботи з масивами. Ця функція використовується для того, щоб гранично просто переглянути вміст масиву і взаємодіяти з даними.


Команди

При оголошенні індексованого РНР-масиву після того, як буде встановлено ім 'я змінної, встановлюється також пара квадратних дужок, в яких вказується безпосередньо позиція даного масиву. Також існує кілька основних команд, які потрібно знати при створенні даного масиву:

  • Ця функція отримує нуль або більше елементів, після чого повністю повертає масив, який складається з таких елементів.
  • Ця конструкція є дещо схожою на array, однак її основним призначенням є одночасне присвоювання різних значень, які витягуються з масиву, одночасно до декількох змінних.
  • Ця конструкція забезпечує швидке і просте створення масиву цілих чисел з інтервалу, який визначається нижньою і верхньою межами. Ця команда повністю повертає масив, складений з цілих чисел зазначеного інтервалу.
  • Розділяє масив на декілька відрізків.

Як можна використовувати такі масиви?

У будь-якому випадку строковий літерал повинен полягати в лапки в індексі асоціативного масиву. Досить часто можна зустріти в старих скриптах синтаксис, в якому лапки відсутні, і це дійсно може працювати, хоча і є невірним. У даному випадку причина полягає в тому, що даний код містить в собі замість рядка невизначену константу, внаслідок чого у PHP виведення масиву може бути таким, що "голий рядок" автоматично може бути перетворений на повноцінний рядок, що має відповідне значення. Іншими словами, якщо спочатку не було можливості визначити встановлену константу, в такому випадку PHP самостійно додасть лапки, після чого використовує введений рядок правильно.

При цьому варто відзначити, що далеко не завжди потрібно ключі укладати в лапки. Наприклад, немає ніякої необхідності, щоб у лапки укладати змінні або ж константи, оскільки в даному випадку в PHP виведення масиву може бути некоректним, і дані команди будуть неправильно оброблені.

Чим це загрожує?

Якщо в майбутньому команда розробників PHP вирішить додати якесь нове ключове слово або ж додаткову константу, то в такому випадку у вас можуть з 'явитися проблеми. Те ж саме стосується і тієї ситуації, якщо константа з іншого коду втрутиться у ваш масив. Наприклад, у вас може пропасти можливість використовувати такі слова, як default і empty, так як вони являють собою зарезервовані ключі.

Перетворення на масив

Для будь-якого з типів ключів перетворення значення в PHP-масиви, функції яких вибирає сам користувач, в кінцевому підсумку надає масив з єдиним елементом, що має скалярне значення.


Якщо ви вирішите перетворити на масив об 'єкт, то в такому випадку як елементи даного масиву будуть використані властивості даного об' єкта. Після того як ви вирішите, як ви бажаєте вивести масив у PHP, у якості ключів буде використано імена властивостей даного об 'єкта з певними винятками:

  • ви втратите доступ до цілочисельних властивостей;
  • попереду кожного закритого поля класу буде приписано ім 'я;
  • захищені поля класу попереду мають приписаний символ.

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

Як бачите, використання таких масивів є гранично простим для просунутих користувачів, а що ще більш важливо - вони гранично зручні у своєму використанні. Жоден великий проект неможливо уявити собі без використання різних типів масивів, при цьому ми на даний момент постаралися розглянути тільки певну частину особливостей і доступних функцій таких систем, не вдаючись в якісь тонкощі того, як їх можна використовувати в різних ситуаціях.