Масиви
Масив у PHP – це впорядкована структура даних, яка пов'язує значения иключі. Цей тип даних оптимізований для різних цілей, тому з ним працюють як з масивом, списком (вектором), хеш-таблицею (реалізацією карти), словником, колекцією, стеком, чергою і, можливо, ще чимось. Оскільки значення масиву бувають інші масиви, також доступні дерева і багатовимірні масиви.
Пояснення цих структур даних виходить за рамки цього посібника, але щонайменше один приклад буде наведено для кожної з них. За додатковою інформацією звертаються до великого обсягу літератури на цю велику тему.
Синтаксис
Определение при помощиarray()
Масив (array) створюють мовною конструкцією array(). Як аргументи вона приймає будь-яку кількість розділених комами пар ключ => значення
array(
key => value,
key2 => value2,
key3 => value3,
...
)
Кома після останнього елемента масиву необов'язкова і її можна опустити. Зазвичай це робиться для однорядкових масивів, краще віддати перевагу array(1, 2)
замість array(1, 2, )
. Для багаторядкових масивів, навпаки, зазвичай вказують кому, що висить, так як спрощує додавання нових елементів в кінець масиву.
Зауваження :
Існує короткий синтаксис масиву, який замінює мовну конструкцію
array()
вираз[]
Приклад #1 Простий масив
Loading...
Ключ масиву (key) можна вказувати або як ціле значення (int), або як рядок (string). Значення масиву (value) може належати будь-якому типу даних.
Додатково відбудуться такі перетворення ключа key:
- Рядки (string), що містять ціле число (int) (за винятком випадків, коли перед числом вказують знак
+
), будуть перетворені на ціле число (int). Наприклад, ключ зі значенням«8»
збережеться зі значенням8
. При цьому значення«08»
не перетворюється, оскільки воно - не коректне десяткове ціле. - Числа з плаваючою точкою (float) також перетворюються на цілі значення (int) - дробова частина буде відкинута. Наприклад, ключ зі значенням
8.7
буде збережеться зі значенням8
- Логічний тип (bool) також перетворюється на цілий тип (int). Наприклад, ключ зі значенням**
true
збережеться зі значенням , а ключ зі значеннямfalse
**збережеться зі значенням - Тип null перетворюється на порожній рядок. Наприклад, ключ зі значенням
null
збережеться зі значенням""
- Масиви (array) та об'єкти (object)не можнавказувати як ключі. Це згенерує попередження:
Неприпустимий тип зміщення (Illegal offset type)
Якщо декількома елементами в оголошенні масиву вказано однаковий ключ, лише останній буде збережено, а інші будуть перезаписані.
Приклад #2 Приклад перетворення типів та перезапису елементів
Loading...
Результат виконання наведеного прикладу:
array(1) {
[1]=>
string(1) "d"
}
Оскільки всі ключі в наведеному прикладі перетворюються на , значення буде перезаписано на кожен новий елемент і залишиться тільки останнє значення «d»
PHP дозволяє масивам містити одночасно цілі (int) і рядкові (string) ключі, оскільки PHP однаково сприймає індексні та асоціативні масиви.
Приклад #3 Змішані цілочислові (int) та рядкові (string) ключі
Loading...
Результат виконання наведеного прикладу:
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
Ключ (key) – необов'язковий. Якщо він не вказаний, PHP інкрементує попереднє найбільше ціле (int) значення ключа.
Приклад #4 Індексні масиви без ключа
Loading...
Результат виконання наведеного прикладу:
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}
Дозволено вказувати ключ одним елементам та пропускати для інших:
Приклад #5 Ключі для деяких елементів
Loading...
Результат виконання наведеного прикладу:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
Видно, что последнее значение«d»
надалося ключу 7
. Це сталося тому, що перед цим найбільшим значенням цілого ключа було 6
Приклад #6 Розширений приклад перетворення типів та перезапису елементів
Loading...
Результат виконання наведеного прикладу:
array(7) {
[1]=>
string(1) "g"
[-1]=>
string(1) "d"
["01"]=>
string(1) "e"
["1.5"]=>
string(1) "f"
[0]=>
string(1) "h"
[""]=>
string(1) "j"
[2]=>
string(1) "l"
}
Цей приклад включає всі варіації перетворення ключів та перезапису елементів
Доступ до елементів масиву через синтаксис квадратних дужок
Доступ до елементів масиву можна отримувати, використовуючи синтакс. array[key]
Приклад #7 Доступ до елементів масиву
Loading...
Результат виконання наведеного прикладу:
string(3) "bar"
int(24)
string(3) "foo"
Зауваження :
До PHP 8.0.0 квадратні та фігурні дужки могли взаємозамінюватися при доступі до елементів масиву (наприклад, у наведеному прикладі
$array[42]
и$array{42}
робили те саме). Синтаксис фігурних дужок застарів із PHP 7.4.0 і більше не підтримується з PHP 8.0.0.
Приклад #8 Розіменування масиву
Loading...
Зауваження :
Спроба доступу до невизначеного ключа в масиві — це те саме, що й спроба доступу до будь-якої іншої невизначеної змінної: буде видано помилку рівня
E_WARNING
(ошибка уровня**E_NOTICE
** до PHP 8.0.0), і результат дорівнюватимеnull
Зауваження :
Спроба розіменувати не масив, а скалярне значення, яке відрізняється від рядка (string), віддасть
null
, Тоді як розйменування рядка (string) трактує її як індексний масив. При такій спробі до PHP 7.4.0 не видавалося повідомлення про помилку. З PHP 7.4.0 видається помилка рівняE_NOTICE
; з PHP 8.0.0 видається помилка рівняE_WARNING
Створення та модифікація із застосуванням синтаксису квадратних дужок
Розробник може змінювати існуючий масив явною установкою значень.
Це робиться шляхом присвоєння значень масиву (array) із зазначенням ключа у квадратних дужках. Крім того, якщо опустити ключ, вийде порожня пара дужок ([]
$arr[key] = value;
$arr[] = value;
// Ключ key может принадлежать типу int или string
// Значение value может быть любым значением любого типа
Якщо масив $arr ще не існує або для нього встановлено значення **null
** або **false
**він буде створений. Таким чином, це ще один спосіб визначити масив array. Однак такий спосіб застосовувати не рекомендовано, оскільки якщо змінна $arr вже містить значення (наприклад, рядок (string) із змінної запиту), то це значення залишиться на місці та вираз []
може означати доступ до символу в рядку. Краще ініціалізувати змінну явним наданням значення.
Зауваження: Починаючи з PHP 7.1.0 оператор порожнього індексу на рядку викине фатальну помилку Раніше рядок мовчки перетворювався на масив.
Зауваження: З PHP 8.1.0 спосіб, яким створювали новий масив приведенням до нього значення
false
, застарілий. Спосіб, яким створюють новий масив приведенням до нього значенняnull
і невизначеного значення, як і раніше, доступний.
Для зміни конкретного значення елементу просто надають нове значення, вказуючи його ключ. Якщо потрібно видалити пару ключ/значення, необхідно викликати конструкцію unset()
Loading...
Зауваження :
Як було сказано раніше, якщо розробник не вказав ключ, то буде взято максимальний з існуючих цілих (int) індексів, і новим ключем буде це максимальне значення (в крайньому випадку 0) плюс 1. Якщо цілих (int) індексів ще немає, то ключем буде (нуль).
Враховують, що максимальне ціле значення ключа не обов'язково існує в масиві в даний момент. Воно могло існувати в масиві якийсь час з останньої переіндексації. Наступний приклад це ілюструє:
Loading...Результат виконання наведеного прикладу:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
Деструктуризація масиву
Масиви можна деструктурувати мовними конструкціями []
(починаючи з PHP 7.1.0) або list(). Ці мовні конструкції можна використовувати для деструктуризації масиву на окремі змінні.
Loading...
Деструктуризацію масиву також виконують у конструкції foreach для деструктуризації багатовимірного масиву під час ітерації масивом.
Loading...
Елементи масиву будуть проігноровані, якщо змінна не вказана. Деструктуризація масиву починається з індексу
Loading...
З PHP 7.1.0 асоціативні масиви також можна деструктурувати. Це спрощує вибір потрібного елемента в масивах з числовим індексом, оскільки індекс може бути явно.
Loading...
Деструктуризацією масив користуються, щоб поміняти дві змінні місця.
Loading...
Зауваження :
Оператор
...
не підтримується у привласненнях.
Зауваження :
Спроба отримати доступ до невизначеного ключа масиву аналогічна до будь-якої іншої невизначеної змінної: буде видано повідомлення про помилку рівня
E_WARNING
(помилки рівняE_NOTICE
до PHP 8.0.0), а результатом будет значениеnull
Корисні функції
Для роботи з масивами є чимало корисних функцій. Докладніше про це розказано у розділі « Функції для роботи з масивами ».
Зауваження :
Мовна конструкція unset() вміє видаляти ключі масиву. Зверніть увагу, що масив НЕ буде переіндексовано. Якщо потрібно поведінку в стилі «видалити та зрушити», можна переіндексувати масив функцією array_values()
Loading...
Управляющая конструкцияforeach Існує спеціально для масивів. Вона пропонує простий спосіб перебору масиву.
Що можна і не можна робити з масивами
Чому вираз $foo[bar]
неправильно?
Рекомендовано укладати в лапки рядковий літерал в індексі асоціативного масиву. Наприклад, потрібно писати $foo['bar']
, а не$foo[bar]
. Але чому? Часто у старих скриптах можна зустріти наступний синтаксис:
Loading...
Це не так, хоч і працює. Причина в тому, що цей код містить невизначену константу (bar
), а не рядок ('bar'
- Зверніть увагу на лапки). Це працює, тому що PHP автоматично перетворює «голий рядок» (не укладений у лапки рядок, який не відповідає жодному з відомих символів мови) у рядок зі значенням цього «голого рядка». Наприклад, якщо константа з ім'ям **bar
**не определена, то PHP заменит bar на строку«bar»
і працюватиме з нею.
Увага
Резервний варіант для обробки невизначеної константи як порожнього рядка видає помилку рівня E_NOTICE
. Починаючи з PHP 7.2.0, поведінка оголошена застарілою і видає помилку рівня. E_WARNING
. Починаючи з PHP 8.0.0 видалено та викидає виняток Error
Зауваження: Це не означає, що потрібно завжди укладати ключ у лапки. Не обов'язково укладати в лапки константи або змінніоскільки це завадить PHP обробляти їх.
Loading...Результат виконання наведеного прикладу:
Перевіряємо 0: Notice: Undefined index: $i in /path/to/script.md on line 9 Погано: Добре: 1 Notice: Undefined index: $i in /path/to/script.md on line 11 Погано: Добре: 1 Перевіряємо 1: Notice: Undefined index: $i in /path/to/script.md on line 9 Погано: Добре: 2 Notice: Undefined index: $i in /path/to/script.md on line 11 Погано: Добре: 2
Додаткові приклади, що підтверджують цей факт:
Loading...
Якщо директива error_reportingнастроена на режим отображения ошибок уровня**E_NOTICE
(наПриклад,E_ALL
**), помилки відразу будуть видні. За замовчуванням директива error_reporting налаштована те що, щоб не показувати попередження.
Як зазначено у розділі про синтаксис, усередині квадратних дужок («[
» та «]
») має бути вираз. Тобто такий код працює:
Loading...
Це приклад роботи з функцією, що повертається значенням як індекс масиву. PHP також знає про константів:
Loading...
Обратите внимание, что**E_ERROR
** — це такий самий допустимий ідентифікатор, як і bar
у першому прикладі. Але останній приклад по суті еквівалентний такому запису:
Loading...
оскільки значення константи E_ERROR
відповідає значенню и т. д.
То що ж у цьому поганого?
Колись у майбутньому команда розробників PHP, можливо, захоче додати ще одну константу або ключове слово, або константа з іншого коду може втрутитися. Наприклад, неправильно використовувати слова empty
иdefault
, оскільки вони відносяться до зарезервованим ключовим словам
Зауваження: Повторимо, усередині рядка (string) у подвійних лапках допустимо не оточувати індекси масиву лапками, тому
«$foo[bar]»
- Припустима запис. У прикладах вище пояснено, чому додаткова інформація дана в розділі про обробку змінних у рядках
Перетворення на масив
Перетворення цілого числа (int), числа з плаваючою точкою (float), рядки (string), логічного значення (bool) або ресурсу (resource) у масив — створює масив з одним елементом з індексом 0 та значенням скаляра, який було перетворено. Говорячи інакше, вираз (array) $scalarValue
аналогічно виразу array($scalarValue)
Якщо об'єкт (object) буде перетворено на масив, елементами масиву будуть властивості (змінні-члени) цього об'єкта. Ключами будуть імена змінних-членів, з наступними примітними винятками: цілі численні властивості стануть недоступні; до закритих полів класу (private) на початок буде дописано ім'я класу; до захищених полів класу (protected) на початок буде додано символ '*'. Ці додані з обох сторін значення також отримають NUL
-байти. Неініціалізовані типізовані властивості автоматично відкидаються.
Loading...
Результат виконання наведеного прикладу:
array (
'' . "\0" . 'A' . "\0" . 'B' => NULL,
'' . "\0" . '*' . "\0" . 'C' => NULL,
'D' => NULL,
1 => NULL,
)
Це може викликати дещо несподівану поведінку:
Loading...
Результат виконання наведеного прикладу:
array(3) {
["BA"]=>
NULL
["AA"]=>
NULL
["AA"]=>
NULL
}
Наведений код покаже 2 ключі з ім'ям «AA», хоча один із них насправді має ім'я «\0A\0A».
Якщо перетворити на масив значення null
, вийде порожній масив
Порівняння
Масиви порівнюють функцією array_diff() і операторами масивів
Розпакування масиву
Масив, перед яким вказано оператора ...
, буде розпакований під час визначення масиву Тільки масиви та об'єкти, які реалізують інтерфейс Traversable, можна розпаковувати. Розпакування масиву оператором ...
доступна починаючи з PHP 7.4.0.
Масив можна розпаковувати кілька разів і додавати звичайні елементи до або після оператора. ...
:
Приклад #9 Просте розпакування масиву
Loading...
Распаковка массива оператором...
дотримується семантики функції array_merge(). Тобто пізніші рядкові ключі перезаписують раніші, а цілочисленні ключі перенумеровуються:
Приклад #10 Розпакування масиву з дублюючим ключем
Loading...
Зауваження :
Ключі, тип яких не належить ні цілими числами, ні рядками, викидають виняток TypeError. Такі ключі генеруються лише об'єктом Traversable
Зауваження :
До PHP 8.1 розпакування масиву з рядковим ключем не підтримувалося:
Loading...
Приклади
Масив у PHP - гнучкий тип даних. Ось кілька прикладів:
Loading...
Приклад #11 Виклик мовної конструкції array()
Loading...
Приклад #12 Колекція
Loading...
Результат виконання наведеного прикладу:
Вам нравится красный?
Вам нравится голубой?
Вам нравится зелёный?
Вам нравится жёлтый?
Безпосередня зміна значень масиву допустима через передачу значень посилання.
Приклад #13 Зміна елемента в циклі
Loading...
Результат виконання наведеного прикладу:
Array
(
[0] => КРАСНЫЙ
[1] => ГОЛУБОЙ
[2] => ЗЕЛЁНЫЙ
[3] => ЖЁЛТЫЙ
)
Наступний приклад створює масив, індексація якого починається з одиниці.
Приклад #14 Індекс, що починається з одиниці
Loading...
Результат виконання наведеного прикладу:
Array
(
[1] => 'Январь'
[2] => 'Февраль'
[3] => 'Март'
)
Приклад #15 Заповнення масиву
Loading...
Масиви впорядковані. Порядок змінюють різними функціями сортування. Докладніше про це розказано у розділі « Функції для роботи з масивами ». Для підрахунку кількості елементів у масиві викликають функцію count()
Приклад #16 Сортування масиву
Loading...
Оскільки значення масиву дозволяється бути будь-яким, значення може бути також іншим масивом. Тому дозволено створювати рекурсивні та багатовимірні масиви.
Приклад #17 Рекурсивні та багатовимірні масиви
Loading...
Надання масиву включає копіювання значення. Щоб скопіювати масив за посиланням, вказують оператор присвоювання за посиланням
Loading...