foreach.До цього моменту всі наші змінні (рядки, числа) були “скалярними” — тобто кожна змінна могла зберігати лише одне єдине значення. Якщо нам треба зберегти список з 5 студентів, створювати змінні $student1, $student2, $student3… — це хибний шлях. Якщо їх стане 5 тисяч, програма перетвориться на хаос.
Для зберігання цілих списків і колекцій даних PHP (як і будь-яка інша мова) пропонує спеціальний структурований тип даних — Масив.
Масив (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.
Числові індекси ідеально підходять для простих списків (колір, фрукти, імена). Проте, якщо ми хочемо зберегти інформацію про користувача, запам’ятовувати, що під індексом “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';
?>
Масив — це теж тип даних. Тому ніхто не забороняє в якості значення (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']; // Виведе "Анна"
?>
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
?>
PHP має понад 80 готових швидких (написаних на мові С) функцій для роботи з масивами.
count($array): Рахує і повертає кількість елементів у масиві. (Напр., користувачів у системі: count($usersList)).in_array($search_value, $array): Шукає певне значення (пошук голки в стозі сіна). Повертає true або false. Зручно для перевірок if (in_array('Admin', $roles)).array_key_exists($key, $array): На відміну від in_array, ця перевіряє, чи існує КЛЮЧ ('name').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>";
?>
0.foreach створений спеціально і виключно для зручного “перебору” всіх значень масиву без використання лічильників-ітераторів.$cars = ['BMW', 'Audi'] через код echo $cars[1]; виведе не BMW, а Audi?echo $userArray; призведе до помилки? Яку утиліту потрібно застосовувати програмісту для перевірки/дебагінгу вмісту $userArray (згадайте var_dump() та print_r)?foreach при роботі з масивами порівняно із традиційним циклом for ($i=0; ... )?