nmk

Лекція 5 (2 години). Структури даних: Масиви

План лекції

  1. Концепція масивів. Створення простих (індексованих) масивів.
  2. Асоціативні масиви: ключі та значення.
  3. Багатовимірні масиви.
  4. Ітерація по масивах: цикл foreach.
  5. Огляд базових вбудованих функцій для масивів (сортування, пошук, фільтрація).

Перелік умовних скорочень

Вступ

До цього моменту всі наші змінні (рядки, числа) були “скалярними” — тобто кожна змінна могла зберігати лише одне єдине значення. Якщо нам треба зберегти список з 5 студентів, створювати змінні $student1, $student2, $student3… — це хибний шлях. Якщо їх стане 5 тисяч, програма перетвориться на хаос. Для зберігання цілих списків і колекцій даних PHP (як і будь-яка інша мова) пропонує спеціальний структурований тип даних — Масив.


1. Створення простих (індексованих) масивів

Масив (Array) — це особливий тип змінної, яка може зберігати безліч значень одночасно.

Індексований масив — це найпростіший вид масиву, де кожен збережений елемент отримує свій порядковий номер (індекс) автоматично. КРИТИЧНО ВАЖЛИВО пам’ятати, що нумерація в програмуванні завжди починається з нуля (0).

Синтаксис створення

Існує два способи створення масивів в PHP: старий (через слово array()) та сучасний (через квадратні дужки []). Ми використовуємо виключно сучасний.

<?php
// Створюємо масив із 4 фруктів.
// "Яблуко" отримує індекс 0, "Банан" - 1, "Ківі" - 2, "Апельсин" - 3.
$fruits = ['Яблуко', 'Банан', 'Ківі', 'Апельсин'];

// Звертаємося до конкретного елемента за його індексом у квадратних дужках:
echo "Мій улюблений фрукт: " . $fruits[1]; // Виведе "Банан"

// Щоб замінити значення, звертаємося так само:
$fruits[2] = 'Манго'; // Замінили "Ківі" на "Манго"

// Щоб додати новий елемент В КІНЕЦЬ масиву (push), ставимо порожні дужки []:
$fruits[] = 'Груша'; // Груша стане 5-м елементом (з індексом 4)
?>

Якщо ви спробуєте звернутися до індексу, якого не існує (echo $fruits[100];), PHP видасть попередження: Warning: Undefined array key 100.

2. Асоціативні масиви: ключі та значення

Числові індекси ідеально підходять для простих списків (колір, фрукти, імена). Проте, якщо ми хочемо зберегти інформацію про користувача, запам’ятовувати, що під індексом “0” лежить ім’я, а під “1” лежить його вік — незручно.

Асоціативний масив — це масив, де індексами виступають не числа, а осмислені текстові рядки-ключі. Вони нагадують структуру “Словника” (Dictionary) або JSON-об’єкта.

<?php
// Використовуємо оператор "стрілка" (=>) для прив'язки Ключа до Значення
$user = [
    'name' => 'Олександр',
    'age'  => 25,
    'city' => 'Київ',
    'is_admin' => false
];

// Щоб дістати вік, ми більше не думаємо про цифри 0, 1, 2.
// Ми звертаємося по зрозумілому імені:
echo $user['name'] . ' проживає в місті ' . $user['city'];

// Додати новий ключ дуже просто:
$user['ip_address'] = '192.168.1.5';
?>

3. Багатовимірні масиви (Матрешка)

Масив — це теж тип даних. Тому ніхто не забороняє в якості значення (Value) покласти не просто рядок чи цифру, а… ще один масив! Коли в масиві лежать інші масиви — він називається багатовимірним. Це найбільш популярний спосіб імітації Бази Даних у PHP до підключення SQL.

<?php
// Масив користувачів (де кожен користувач - це теж асоціативний масив)
$usersList = [
    [
        'id' => 1,
        'name' => 'Іван',
        'email' => 'ivan@test.com'
    ],
    [
        'id' => 2,
        'name' => 'Анна',
        'email' => 'anna@test.com'
    ]
];

// Як звернутися до Анни?
// 1. Спочатку стукаємо в перший масив (Анна лежить під індексом 1).
// 2. Потім всередині знайденого масиву беремо ключ 'name'.
echo $usersList[1]['name']; // Виведе "Анна"
?>

4. Ітерація по масивах: цикл foreach

Звичайний цикл for ($i = 0; ...) можна використовувати тільки для простих пронумерованих (індексованих) масивів. А що робити з асоціативними?

У PHP існує спеціалізований, дуже зручний і швидкий цикл — foreach (для-кожного). Він автоматично “бере за руку” масив, проходить його з першого елемента і зупиняється рівно на останньому. Ніяких лічильників і ризику “нескінченного циклу”!

Синтаксис: Тільки значення

<?php
$colors = ['Червоний', 'Зелений', 'Синій'];

foreach ($colors as $item) {
    // PHP сам бере черговий елемент з $colors і кладе його в тимчасову змінну $item
    echo "Колір: $item <br>";
}
?>

Синтаксис: З ключем і значенням (для асоціативних масивів)

<?php
$user = [
    'name' => 'Олександр',
    'age'  => 25,
    'city' => 'Київ'
];

// Ми просимо PHP: "відірви ключ і поклади в $key, а значення поклади в $val"
foreach ($user as $key => $val) {
    echo "Ключ: <b>$key</b> містить значення: $val <br>";
}
// Результат в браузері:
// Ключ: name містить значення: Олександр
// Ключ: age містить значення: 25
?>

5. Огляд базових вбудованих функцій для масивів

PHP має понад 80 готових швидких (написаних на мові С) функцій для роботи з масивами.

  1. count($array): Рахує і повертає кількість елементів у масиві. (Напр., користувачів у системі: count($usersList)).
  2. in_array($search_value, $array): Шукає певне значення (пошук голки в стозі сіна). Повертає true або false. Зручно для перевірок if (in_array('Admin', $roles)).
  3. array_key_exists($key, $array): На відміну від in_array, ця перевіряє, чи існує КЛЮЧ ('name').
  4. Сортування:
    • sort($array) — сортує числа за зростанням або рядки за алфавітом, знищуючи ключі (розбиває їх).
    • asort($array) — те ж саме, але зберігає прив’язку до ключів (корисно для асоціативних масивів).
    • ksort($array) — сортує масив не за значеннями, а за Ключами.
<?php
$numbers = [4, 1, 9, 3];
sort($numbers);
// Тепер там: [1, 3, 4, 9]

// Щоб швидко "подивитися" що лежить в масиві (для дебагінгу), echo не працює!
// echo $numbers; // Помилка: Array to string conversion

// Для розробників існують функції print_r() та var_dump():
echo "<pre>"; // Форматує вивід
var_dump($numbers);
echo "</pre>";
?>

Висновки

  1. Масиви — це структури для зберігання множинних даних в одній змінній.
  2. Індексовані масиви автоматично ідентифікують свої елементи числами від 0.
  3. Асоціативні масиви дозволяють іменувати комірки (ключі), що робить код інтуїтивно зрозумілим.
  4. Цикл foreach створений спеціально і виключно для зручного “перебору” всіх значень масиву без використання лічильників-ітераторів.
  5. Замість того, щоб писати власні цикли для пошуку найбільшого числа або сортування, в PHP завжди потрібно спершу подивитись на наявність уже готових, оптимізованих вбудованих функцій.

Джерела

  1. Офіційна документація по Масивах: https://www.php.net/manual/ru/language.types.array.php
  2. Функції роботи з масивами: https://www.php.net/manual/ru/ref.array.php

Запитання для самоперевірки

  1. Чому спроба доступитись до першого елемента масиву $cars = ['BMW', 'Audi'] через код echo $cars[1]; виведе не BMW, а Audi?
  2. Яким оператором ми розділяємо “Ключ” і його “Значення” під час створення асоціативного масиву? А яким — звичайні змінні під час їх присвоєння?
  3. Чому виведення в браузер структурних даних типу масиву через класичну команду роздрукки echo $userArray; призведе до помилки? Яку утиліту потрібно застосовувати програмісту для перевірки/дебагінгу вмісту $userArray (згадайте var_dump() та print_r)?
  4. У чому головна відмінність (перевага дизайну) циклу foreach при роботі з масивами порівняно із традиційним циклом for ($i=0; ... )?
  5. Назвіть 3 випадки з реального життя сайту (інтернет-магазину чи блогу), коли багатовимірні масиви будуть необхідним способом зберігання структур замість скалярних одиничних змінних.