7. Цикл for each
Даний тип циклу призначений спеціально для перебору всіх елементів масиву і був доданий тільки в четвертій версії мови РНР. Виглядає він таким чином:
foreach (масив as $key=>$value)
команди;
Тут команди циклічно виконуються для кожного елементу масиву, при цьому чергова пара ключ=>значення зберігається в змінних $key і $vaiue.
Розглянемо приклад як можна відобразити вміст всіх глобальних змінних
за допомогою for each:
foreach ($GLOBALS as $k=>$v)
echo "<b>$k</b> => <tt>$v</ttxbr>\n";
У циклу for each є і інша форма запису, який слід застосовувати, коли розробника не цікавить значення ключа чергового елементу. Виглядає вона так:
foreach (масив as $value)
команди;
В цьому випадку доступне лише значення чергового елементу масиву, але
не його ключ. Це може бути корисно, наприклад, для роботи з масивами- списками.
Цикл foreach оперує не початковим масивом, а його копією. Це означає, що будь-які зміни, які вносяться до масиву, не можуть бути "видимі" з тіла циклу. Це дозволяє, наприклад, використовувати як масив не тільки змінну, але і результат роботи деякої функції, що повертає масив. В цьому випадку функція буде викликана всього один раз — до початку циклу, а потім робота проводитиметься з копією поверненого значення.
8. Конструкція swith-case
Часто замість декількох розміщених підряд інструкцій if-else доцільно скористатися спеціальною конструкцією switch-case:
switch(вираз){
case значення1: команди1; [break;]
case значение2: командu2; [break;]
………
case значенняN: командuN; [break;]
[default: команди_по_умолчанню; [break]]
}
Працює ця конструкція таким чином: обчислює значення виразу (нехай воно рівне, наприклад, v), а потім намагається знайти рядок, що починається з case v:. Якщо такий рядок знайдено, виконуються команди, розміщені відразу після нього (причому на всі подальші оператори case дещо: увага не звертається, неначе їх немає, а код після них залишається без змін). Якщо ж знайти такий рядок не вдалося, виконуються команди після default (коли вони задані).
Зверніть увагу на оператори break (які умовно розміщені в квадратні дужки, щоб підкреслити їх необов'язковість), що стоять після кожного рядка команд, окрім останнього (для якого можна було б теж вказати break, однак це не має сенсу). Коли б не вони, то при рівності у=значення1 спрацювали б не тільки команди1, але і всі інші, що знаходяться нижче.
Ось альтернативний синтаксис для конструкції switch-case:
switch(вираз):
case значення1: команди1; [break;]
………
case значенняN: командuN; [break;]
[default: команди_по_умолчанню; [break]]
endswitch;
12. Відкриття файлів
Основна функція при роботі з файлами – це відкриття файлів. В РНР файли відкриваються за допомогою функції fopen(). Дану функцію можна використовувати для відкриття будь-якого файлу у файловій системі сервера або через HTTP або FTP в Інтернеті:
int fopen(string filename, string mode);
В наведеному прикладі аргумент filename є ім'ям файлу, що відкривається; аргумент mode указує на режим, в якому повинен бути відкритий файл (для читання, запису або доповнення). Цей аргумент може мати одне з наступних значень:
Таб. 1
Значення |
Опис |
a |
Відкрити файл тільки для доповнення. Дані будуть дописані в кінець існуючого файлу. Якщо файл не існує, РНР намагається створити його. |
a+ |
Відкрити файл для доповнення і читання. Дані будуть дописані в кінець існуючого файлу. Якщо файл не існує, РНР намагається створити його. |
r |
Відкрити файл тільки для читання. |
r+ |
Відкрити файл для читання і запису. Дані будуть записані в початок існуючого файлу. |
w |
Відкрити файл тільки для запису. Існуючий вміст файлу буде втрачений. Якщо файл не існує, РНР намагається створити його. |
w+ |
Відкрити файл для читання і запису. Існуючий вміст файлу буде втрачений. Якщо файл не існує, РНР намагається створити його. |
Зверніть увагу, що файли з URL HTTP можуть відкриватися тільки для читання. Проте файли можна відправляти через FTP, хоча їх не можна відкривати одночасно для читання і запису.
До цих значень можна додати прапор b, який вказує на те, що файл треба обробляти як двійковий (бінарний), а не як текстовий (наприклад, якщо це графічний файл). Якщо (як в системах Unix) між двійковими і текстовими файлами не робиться відмінності, це значення просто ігнорується.
При успішному виконанні функція fopen() повертає дескриптор файлу (file handle) - ціле число, що дозволяє посилатися на файл при подальших викликах функцій; при невдачі функція fopen() повертає false:
if (!$file=fopen("picture.gif", "rb")) {
echo("Неможливо відкрити файл "); // Якщо fopen() повертає Про
// неможливо відкрити файл } else {
fpassthru($file); // Вивести зображення
}
Функція fpassthru(), яка використана в прикладі, призначена для
виведення зображення.
13. Закриття файлів
Закінчивши роботу з файлом, необхідно, звичайно, його закрити. Це робиться за допомогою функції fclose ().
int fclose(int fp);
Єдиний параметр цієї функції – це дескриптор файлу, що закривається, і у випадку успішного закриття файлу вона повертає true, а у випадку невдачі - false.