- •Понятие массива
- •Понятие списка
- •2. Ассоциативные массивы
- •3. Инструкции list()
- •4. Инструкция array() и создание многомерных массивов
- •5. Операции над массивами
- •5.1. Удаление массивов
- •5.3. Перебор массива
- •Косвенный перебор
- •Прямой перебор
- •Недостатки косвенного перебора
- •6. Сортировка массивов
- •Сортировка массивов по ключам. Функции ksort() и krsort()
- •Сортировка списка
- •7. Получение части массива
- •8. Добавление и удаление элементов массива
- •Добавление в конец массива
- •Удаление последнего элемента списка
- •9. Переменные и массивы. Взаимные переходы
- •Упаковка переменных в массив. Функция compact()
- •10. Создание диапазона чисел
- •11. Небольшой практический пример
- •Задание
«с точностью до наоборот», то есть создает переменные с именами, соответствующими именам ключей и присваивает им значения элементов массива. Распакуем наш «упакованный массив»:extract($A);
В процессе распаковки может оказаться, что уже существует переменная с именем, как имя ключа в массиве $А. Для решения этой проблемы у функции extract() предусмотрен второй параметр, который позволяет определить поведение функции extractQ в случае совпадения имен. Значение EXTR_OVERWRITE означает, что существующая переменная с именем ключа будет перезаписана, a EXTR_SKIP — пропущена:
$Name = "Вася";
$Email = "vasya@vvv.org";
$А = compact("Name","Email") ; $Name = "Ivan";
extract($A,EXTR_OVERWRITE); // $Name = "Ivan", так как мы
//указали EXTR_OVERWRITE
Значение EXTR_OVERWRITE используется по умолчанию и может не указываться. То есть достаточно указать extract($A) и все переменные будут перезаписаны. Кроме того, в PHP предусмотрено еще одно значение второго параметра функции extractQ — это значение EXTR_PREFIX_ALL. В этом случае при разпаковке массива все имена создаваемых переменных будут предварены специальным префиксом, который нужно будет указать в качестве третьего параметра функции extractQ. Например, если мы в рассмотренном выше примере разпаковку произведем следующим образом: extract($A,EXTR_PREFIX_ALL, "D_"); то на выходе будут созданы переменные $D_Name и $D_Email, то есть при создании переменных к имени ключа присоединится указанный префикс D_.
10. Создание диапазона чисел
Иногда нужно создать диапазон чисел, например, для нумерации записей в выводимой таблице. Создать диапазон чисел можно очень просто:
$List = array();
for($i=10; $i<=100; $i++) $List[]=$i;
Данный цикл создает список, заполненный целыми числами от 10 до 100 включительно. В PHP можно обойтись значительно проще — одним вызовом функции range(10, 100).
11. Небольшой практический пример
Попробуем написать сценарий, выводящий содержимое каталога. Причем сценарий должен не просто выводить содержимое каталога, а в алфавитном порядке и каталоги должны предшествовать файлам (см. листинг 7.2). Мы будем использовать ранее написанную и приведенную в листинге 7.1 функцию стр(), которая сравнивает файлы и каталоги.
Листинг 2. Сценарий files,php
<?
//Получаем содержимое текущего каталога. Для нашего сценария текущим будет каталог /var/www/html
//($DocumentRoot)
exec("Is -1",$Files); function cmp($el_l, $el_2)
{
if (is__dir($el_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>Cцeнapий files.php</titlexbody>"; echo "<Ь1>Содержимое каталога /</hlXp>"; foreach($Files as $f)
if (is_dir($f)) echo "<br><img src=folder.png>$f"; else echo "<brximg src=doc.png>$f";
echo "</bodyX/html>"; ?>
Разберемся, как работает сценарий. Сначала мы формируем список файлов и каталогов. Можно было бы воспользоваться стандартными функциями PHP, но намного проще (в Linux) вызвать команды Is с параметром -1 (вывод в одну колонку). Функция ехес() вызывает команду Is и записывает ее вывод в список $Files. Потом мы вызываем функцию uasortQ, которая сортирует наш список в нужном нам порядке — сначала она сортирует каталоги в алфавитном порядке, а затем — файлы. В результате мы получаем список, в котором сначала идут каталоги, отсортированные по алфавиту, а затем — файлы (тоже отсортированные по алфавиту). В цикле foreach мы анализируем элемент нашего списка: если он является каталогом, мы выводим рядом с его именем картинку папки, а если файлом — картинку документа (см. рис. 1).
Рис. 1. Результат работы сценария files.php
Задание
На примере показать отличие массива и списка. Посчитать количество символов в массиве (если массивов несколько, то в первом).
1.Заполнить два массива, соответственно, случайными целыми числами в диапазоне от -20 до 30. Из полученных двух массивов создать два массива отдельно отрицательных и положительных чисел. Для контроля результата сделать распечатку массивов, в том числе исходного.
2.Заполнить два массива случайным образом буквами латинского алфавита. Заполнить третий массив теми буквами, которые входят и в первый и во второй массив, четвертый - оставшимися буквами из первого и второго. Для контроля результата сделать распечатку массивов, в том числе исходного.
3.Заполнить массив случайным образом, выделить в отдельные массивы буквы латинского алфавита, как заглавные, так и прописные. Для контроля результата сделать распечатку массивов, в том числе исходного.
4.Заполнить массив случайным образом в диапазоне от -20 до 20,посчитать среднее всех элементов массива. Все элементы массива, которые меньше среднего значения на 50% заменить на среднее значение. Для контроля результата сделать распечатку массивов, в том числе исходного.
5.В исходном массиве (размер 30 элементов), заполненный цифрами случайным образом, замените все повторные вхождения цифр на 0, а все оставшиеся элементы массива поместить в отдельный массив. Для контроля результата сделайте распечатку массивов, в том числе исходного.
6.Заполните случайным образом 2 массива ( по 20 элементов) поочередно цифрами 1 от до 4 и цифрами от 5 до 9. Объедините эти массивы. Найдите среднее всех элементов массива. Для контроля результата сделайте распечатку массивов, в том числе исходного.
7.В исходном массиве символов, заполненном случайным образом символами с кодами в диапазоне от 21 до 254, выделить в отдельные массивы строчные буквы латинского алфавита. Для контроля результата сделать распечатку массивов, в том числе исходного.
8.Дан массив символов. Ввод массива производить с клавиатуры. Отсортировать массив таким образом, чтобы символы входили в массив по алфавитному порядку. Для контроля результата сделать распечатку массивов, в том числе исходного.
9.Дано 2 массива символов. Ввод массивов производить с клавиатуры. Символы, повторяющиеся в 1 и 2 массиве поместить в 3 массив. Для контроля результата сделать распечатку массивов, в том числе исходного.
10.В исходном массиве (размер 20 элементов), ввод массива производить с клавиатуры, посчитать среднее всех элементов массива. Замените все элементы массива, которые больше среднего значения, на 0, а все оставшиеся элементы массива поместить в отдельный массив. Для контроля результата сделайте распечатку массивов, в том числе исходного.
11.Введите с клавиатуры текст в массив символов. Определите какие из слов в массиве состоят из букв с возрастающими кодами. Разместите эти слова в отдельный массивы. Для контроля результата сделайте распечатку массивов, в том числе исходного.
12.Из исходного массива символов, текст вводить с клавиатуры, символами с кодами в диапазоне от 21 до 254, выделить в отдельные массивы символы цифр. Для контроля результата сделать распечатку массивов, в том числе исходного.
13.Заполнить два массива, размером 20 и 30 элементов, соответственно, случайными целыми числами в диапазоне от -50 до 50. Из полученных двух массивов создать два массива отдельно, один из которых содержит числа от -10 до 0, а другой - от 40 до 50. Для контроля результата сделать распечатку массивов, в том числе исходного.
14.Заполните случайным образом массив (30 элементов) поочередно буквами латинского алфавита от A до H и цифрами 1 от до 5. Посчитать среднее значение всех элементов 2 массива. Заменить в 1 массиве каждый второй элемент на это значение. Для контроля результата сделайте распечатку массивов, в том числе исходного.
15.Заполнить два массива размером 20 и 30 элементов, ввод массивов производить
склавиатуры. Заполнить третий массив теми числами, которые входят и в первый и во второй массив, четвертый - оставшимися числами из первого и второго. Для контроля результата также сделать распечатку массивов, в том числе исходного.