Змінні і масиви. Взаємні переходи
Упаковка змінних в масив. Функція 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).