Змінні і масиви. Взаємні переходи Упаковка змінних в масив. Функція compact() Функція compact() «упаковує» змінні і їх значення в масив. В результаті виходить асоціативний масив, ключами якого є імена, змінних, а значеннями елементів — значення змінних. Розглянемо сказане на прикладі. Припустимо, що у нас є дві змінні: $Name = "Вася"-; $Email = "vasya@vvv.org"; Функція compact("Name",''Email") упакує змінні в один масив: $А = compact("Name","Email"); //отримуємо $A =array("Ыате"=>"Вася","Email"=>"vasyaSvvv.org"); Параметри функції compact() описані як mixed, тому що параметри можуть бути не тільки рядками, але і списками рядків. Якщо так воно і є, функція перебирає всі елементи цього списку і упаковує змінні, імена яких вона зустріла. Ось невеликий приклад: $а = "AAA"; $b = "BBB"; $с = "CCC"; $Arr = array("b","с"); $Massiv = compact("a",$Arr); // $Massiv = array("a"=>"AAA","b"="BBB","c"="CCC"); Разупаковка (витягання) змінних з масиву. Функція extract() Існує функція, протилежна функції compact() — це функція extract(). Вона діє «з точністю до навпаки», тобто створює змінні з іменами, відповідними іменам ключів і привласнює їм значення елементів масиву. Розпакуємо наш «упакований масив»: extract($A); В процесі розпаковування може опинитися, що вже існує змінна з ім'ям, як ім'я ключа в масиві $А. Для вирішення цієї проблеми у функції extract() передбачений другий параметр, який дозволяє визначити поведінку функції extract() у разі збігу імен. Значення EXTR_OVERWRITE означає, що існуюча змінна з ім'ям ключа буде перезаписана, а EXTR_SKIP — пропущена: • $Name = "Вася"; $Email = "vasya@vvv.org"; $А = compact("Name","Email"); $Name = "Ivan"; extract($A,EXTR_OVERWRITE); // $Name = "Ivan", оскільки ми //вказали EXTR_OVERWRITE Значення EXTR_OVERWRITE використовується за умовчанням і може не указуватися. Тобто досить вказати extract(SA) і всі змінні будуть перезаписані. Крім того, в PHP передбачено ще одне значення другого параметра функції extract() — це значення EXTR_PREFIX_ALL. В цьому випадку при разупаковке масиву всі імена створюваних змінних передуватимуть спеціальним префіксом, який потрібно буде вказати як третього параметра функції extract(). Наприклад, якщо ми в розглянутому вище прикладі разупаковку проведемо таким чином: extract($A,EXTR_PREFIX_ALL, "D_"); то на виході будуть створені змінні $D_Name і $D_Email, тобто при створенні змінних до імені ключа приєднається вказаний префікс D_. 7.10. Створення діапазону чисел Іноді потрібно створити діапазон чисел, наприклад, для нумерації записів в таблиці, що виводиться. Створити діапазон чисел можна дуже просто: $List = array(); for($i = 10; $ i < = 10 0; $i + +) $List[]=$i; Даний цикл створює список, заповнений цілими числами від 10 до 100 включно. У PHP можна обійтися значно простіше — одним викликом функції range(10, 100). 7.11. Невеликий практичний приклад Спробуємо написати сценарій, що виводить вміст каталога. Причому сценарій винен не просто виводити вміст каталога, а в алфавітному порядку і каталоги повинні передувати файлам (див. лістинг 7.2). Ми використовуватимемо раніше написану і приведену в лістингу 7.1 функцію cmp(), яка порівнює файли і каталоги. Лістинг 7.2. Сценарій files.php // Отримуємо вміст поточного каталога. Для нашого сценарію поточним буде каталог /var/www/html // ($DocumentRoot) exec("ls -1",$Files); function cmp($el_l,$el_2) { if (is_dir(5el_l) && !is_dir($el_2)) return -1; if (!is_dir($el_l) && is_dir($el_2)) return 1; if($el_K$el_2) return -1; elseif($el_l>$el_2) return 1; else return 0; } uasort($Files,"cmp") ; echo "<html><title>CueHapnH files.php</title><body>"; echo "<Ь1>Содержимое каталога /</hl><p>"; foreach($Files as $f) if (is_dir($f)) echo "<br><img src=folder.png>$f"; else echo "<br><img src=doc.png>$f"; echo "</body></html>"; Розберемося, як працює сценарій. Спочатку ми формуємо список файлів і каталогів. Можна було б скористатися стандартними функціями PHP, але набагато простіше (у Linux) викликати команди ls з параметром —1 (висновок в одну колонку). Функція exec() викликає команду ls і записує її висновок в список $Files. Потім ми викликаємо функцію uasort(), яка сортує наш список в потрібному нам порядку — спочатку вона сортує каталоги в алфавітному порядку, а потім — файли. В результаті ми отримуємо список, в якому спочатку йдуть каталоги, відсортовані за абеткою, а потім — файли (теж відсортовані за абеткою). У циклі foreach ми аналізуємо елемент нашого списку: якщо він є каталогом, ми виводимо поряд з його ім'ям картинку теки, а якщо файлом — картинку документа (див. мал. 7.1).