Лабораторная работа 3. Разработка скриптов для генерации страниц
Скачать 248.71 Kb.
|
Проверяем истинность введенного пароля:";if (md5($pass_a)===md5($pass_b)) echo " \"color:green\">Пароль верный! (Хеш-коды совпадают)В данной ситуации выводит: Пароль верный! (Хеш-коды совпадают) Попробуйте изменить значение строки $pass_b :) выражениях, где необходима строка, преобразование происходит автоматически. Это происходит, когда вы используете функции echo() или print(), либо когда вы сравниваете значение переменной со строкой.
11) $foo = 4 + "10.2 Little Piggies"; // $foo это float (14
Более подробную информацию об этом преобразовании смотрите в разделе о strtod(3) документации Unix. Если вы хотите протестировать любой из примеров этого раздела, вы можете скопировать и вставить его и следующую строку, чтобы увидеть, что происходит: echo "\$foo==$foo; тип: " . gettype ($foo) . " \n"; ?> Не ожидайте получить код символа, преобразовав его в целое (как вы могли бы сделать, например, в C). Для преобразования символов в их коды и обратно используйте функции ord() и chr(). Массивы (Array) Массивы (arrays) - это упорядоченные наборы данных, представляющие собой список однотипных элементов. Существует два типа массивов, различающиеся по способу идентификации элементов.
Важной особенностью PHP является то, что PHP, в отличие от других языков, позволяет создавать массивы любой сложности непосредственно в теле программы (скрипта). Массивы могут быть как одномерными, так и многомерными. Простые массивы и списки в PHP При обращении к элементам простых индексируемых массивов используется целочисленный индекс, определяющий позицию заданного элемента. Простые одномерные массивы: Обобщенный синтаксис элементов простого одномерного массива: $имя[индекс]; Массивы, индексами которых являются числа, начинающиеся с нуля - это списки:
$names[3]="Помидор";
?> Доступ к элементам простых массивов (списков) осуществляется следующим образом:
echo $names[0]; // Вывод элемента массива names с индексом 0 echo " "; echo $names[3]; // Вывод элемента массива names с индекс ом 3
?>
Простые массивы можно создавать, не указывая индекс нового элемента массива, это за вас сделает PHP. Вот пример:
$names[]="Апельсин"; $names[]="Банан"; $names[]="Груша"; $names[]="Помидор";
echo $names[0]; // Вывод элемента массива names с индекс ом 0 echo " ";! echo $names[3]; // Вывод элемента массива names с индексом 3
?> В рассмотренном примере вы можете добавлять элементы массива names простым способом, то есть не указывая индекс элемента массива: $names[]="Яблоко"; Новый элемент простого массива (списка) будет добавлен в конец массива. В дальнейшем, с каждым новым элементом массива, индекс будет увеличиваться на единицу. Простые многомерные массивы: Обобщенный синтаксис элементов многомерного простого массива: $имя[индекс1][индекс2]..[индексN]; Пример простого многомерного массива:
$arr[2][2]="Тыква"; // Выводим элементы массива: echo " ".$arr[0][0].":";!for ($q=0; $q<=2; $q++) {! echo $arr[2][$q]." ";! } echo " ".$arr[0][1].":";for ($w=0; $w<=2; $w++) {! echo $arr[1][$w]." ";! } ?> Ассоциативные массивы в PHP
Ассоциативные массивы особенно удобны в ситуациях, когда элементы массива удобнее связывать со словами, а не с числами. Итак, массивы, индексами которых являются строки, называются ассоциативными массивами. Одномерные ассоциативные массивы Одномерные ассоциативные массивы содержат только один ключ (элемент), соответствующий конкретному индексу ассоциативного массива. Приведем пример:
?> Доступ к элементам одномерных ассоциативных массивов осуществляется так же, как и к элементам обыкновенных массивов, и называется доступом по ключу: echo $names["Иванов"]; Многомерные ассоциативные массивы Многомерные ассоциативные массивы могут содержать несколько ключей, соответствующих конкретному индексу ассоциативного массива. Рассмотрим пример многомерного ассоциативного массива:
$A["Ivanov"] = array("name"=>"Иванов И.И.", "age"=>"25", "email"=>"ivanov@mail.ru"); $A["Petrov"] = array("name"=>"Петров П.П.", "age"=>"34", "email"=>"petrov@mail.ru"); $A["Sidorov"] = array("name"=>"Сидоров С.С.", "age"=>"47 ", "email"=>"sidorov@mail.ru"); ?> Многомерные массивы похожи на записи в языке Pascal или структуры в языке C. Доступ к элементам многомерного ассоциативного массива осуществляется следующим образом: echo $A["Ivanov"]["name"]; // Выводит Иванов И.И. echo $A["Petrov"]["email"]; // Выводит petrov@mail.ru Как вы уже заметили, для создания многомерного ассоциативного массива мы использовали специальную функцию array, мы ее рассмотрим позже, когда будем рассматривать операции над массивами. Ассоциативные многомерные массивы можно создавать и классическим способом, хотя это не так удобно:
$A["Ivanov"]["age"]="25"; $A["Ivanov"]["email"]="ivanov@mail.ru"; $A["Petrov"]["name"]="Петров П.П."; $A["Petrov"]["age"]="34"; $A["Petrov"]["email"]="petrov@mail.ru"; $A["Sidorov"]["name"]="Сидоров С.С."; $A["Sidorov"]["age"]="47"; $A["Sidorov"]["email"]="sidorov@mail.ru";Получаем доступ к ключам многомерного ассоциативного массива echo $A["Ivanov"]["name"]." "; // Выводит Иванов И.И. echo $A["Sidorov"]["age"]." "; // Выводит 47 echo $A["Petrov"] ["email"]." "; // Выводит petrov@mail.ru ?> Фукции для работы с массивами и операции над массивами Функции для работы с массивами Рассмотрим некоторые часто используемые функции для работы с массивами. Функция list() Предположим, у нас есть массив, состоящий из трех элементов: $names[0]="Александр"; $names[1]="Николай"; $names[2]="Яков"; Допустим, в какой-то момент нам нужно передать значения всех трех элементов массива, соответственно трем переменным: $alex, $nick, $yakov. Это можно сделать так: $alex = $names[0]; $nick = $names[1]; $yakov = $names[2]; Если массив большой, то такой способ присвоения элементов массива переменным не очень удобен. Есть более рациональный подход - использование функции list(): list ($alex, $nick, $yakov) = $names; Если нам нужны только "Николай" и "Яков", то мы можем сделать так: list (, $nick, $yakov) = $names; Функцияarray() Функция Array() используется специально для создания массивов. При этом она позволяет создавать пустые массивы. Вот методы использования функции Array():
$arr = array();Создает список с тремя элементами. Индексы начинаются
$arr2 = array("Иванов","Петров","Сидоров");
$arr3 = array("Иванов"=>"Иван", "Петров"=>"Петр", "Сидор ов"=>"Сидор");
$arr4 = array("name"=>"Иванов", "age"=>"24", "email"=>"i vanov@mail.ru"); $arr4 = array("name"=>"Петров", "age"=>"34", "email"=>"p etrov@mail.ru");! $arr4 = array("name"=>"Сидоров", "age"=>"47", "email"=>" sidorov@mail.ru");! ?> Операции над массивами Сортировка массивов Начнем с самого простого — сортировки массивов. В PHP для этого существует очень много функций. С их помощью можно сортировать ассоциативные массивы и списки в порядке возрастания или убывания, а также в том порядке, в каком вам необходимо — посредством пользовательской функции сортировки. Сортировка массива по значениям c помощью функций asort() и arsort(): Функция asort() сортирует массив, указанный в ее параметре, так, чтобы его значения шли в алфавитном (если это строки) или в возрастающем (для чисел) порядке. При этом сохраняются связи между ключами и соответствующими им значениями, т. е. некоторые пары ключ=>значение просто "всплывают" наверх, а некоторые — наоборот, "опускаются". Например: $A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor"); asort($A); foreach($A as $k=>$v) echo "$k=>$v ";
Функция arsort() выполняет то же самое, за одним исключением: она упорядочивает массив не по возрастанию, а по убыванию. Сортировка по ключам с помощью функций ksort() и krsort(): Функция ksort() практически идентична функции asort(), с тем различием, что сортировка осуществляется не по значениями, а по ключам (в порядке возрастания). Например: $A=array("d"=>"Zero", "c"=>"Weapon", "b"=>"Alpha", "a"=>"Processor"); ksort($A); for(Reset($A); list($k,$v)=each($A);) echo "$k=>$v "; // выводит "a=>Processor b=>Alpha c=>Weapon d=>Zero" Функция для сортировки по ключам в обратном порядке называется krsort() и применяется точно в таком же контексте, что и ksort(). Сортировка по ключам при помощи функции uksort(): Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files хранится список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексикографическом порядке, но также и чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами, как того требует uksort().
function FCmp($f1,$f2) { // Каталог всегда предшествует файлу if(is_dir($f1) && !is_dir($f2)) return -1;
if(!is_dir($f1) && is_dir($f2)) return 1;
if($f1<$f2) return -1; elseif($f1> $f2) return 1; else return 0; }
uksort($Files,"FCmp"); // передаем функцию сортировки "по ссылке" ?> Конечно, связи между ключами и значениями функцией uksort() сохраняются, т. е., опять же, некоторые пары просто "всплывают" наверх, а другие — "оседают". Сортировка по значениям при помощи функции uasort() Функция uasort() очень похожа на uksort(), с той разницей, что сменной (пользовательской) функции сортировки "подсовываются" не ключи, а очередные значения из массива. При этом также сохраняются связи в парах ключ=>значение. Переворачивание массива с помощью функции array_reverse() Функция array_reverse() возвращает массив, элементы которого следуют в обратном порядке относительно массива, переданного в параметре. При этом связи между ключами и значениями, конечно, не теряются. Например, вместо того, чтобы ранжировать массив в обратном порядке при помощи arsort(), мы можем отсортировать его в прямом порядке, а затем перевернуть: $A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor"); asort($A); $A=array_reverse($A); Конечно, указанная последовательность работает дольше, чем один-единственный вызов arsort(). Сортировка списка при помощи функций sort() и rsort() Эти две функции предназначены в первую очередь для сортировки списков. Функция sort() сортирует список (разумеется, по значениям) в порядке возрастания, а rsort() — в порядке убывания. Пример для функции sort(): $A=array("40", "20", "10", "30"); sort($A); for($i=0; $i // выводит 10 20 30 40 ?> Перемешивание списка с помощью функции shuffle() Функция shuffle() "перемешивает" список, переданный ей первым параметром, так, чтобы его значения распределялись случайным образом. Обратите внимание, что, во-первых, изменяется сам массив, а во вторых, ассоциативные массивы восприимаются как списки. Пример: $A=array(10,20,30,40,50); shuffle($A); foreach($A as $v) echo "$v "; Приведенный фрагмент кода выводит числа 10, 20, 30, 40 и 50 в случайном порядке. Выполнив этот фрагмент несколько раз, вы можете обнаружить, что от запуска к запуску очередность следования чисел не изменяется. Это свойство обусловлено тем, что функция shuffle() использует стандартный генератор случайных чисел, который перед работой необходимо инициализировать при помощи вызова srand(). Операции с ключами и значениями массива array_flip(array $arr) Функция array_flip() "пробегает" по массиву и меняет местами его ключи и значения. Исходный массив $arr не изменяется, а результирующий массив просто возвращается. Конечно, если в массиве присутствовали несколько элементов с одинаковыми значениями, учитываться будет только последний из них: $A=array("a"=>"aaa", "b"=>"aaa", "c"=>"ccc"); $A=array_flip($A);
array_keys(array $arr [,mixed $SearchVal]) Функция array_keys() возвращает список, содержащий все ключи массива $arr. Если задан необязательный параметр $SearchVal, то она вернет только те ключи, которым соответствуют значения $SearchVal. Фактически, эта функция с заданным вторым параметром является обратной по отношению к оператору [] — извлечению значения по его ключу. array_values(array $arr) Функция array_values() возвращает список всех значений в ассоциативном массиве $arr. Очевидно, такое действие бесполезно для списков, но иногда оправдано для хэшей. in_array(mixed $val, array $arr) Функция in_array() возвращает true, если элемент со значением $val присутствует в массиве $arr. Впрочем, если вам часто приходится проделывать эту операцию, подумайте: не лучше ли будет воспользоваться ассоциативным массивом и хранить данные в его ключах, а не в значениях? На этом вы можете сильно выиграть в быстродействии. array_count_values(list $List) Функция array_count_values() подсчитывает, сколько раз каждое значение встречается в списке $List, и возвращает ассоциативный массив с ключами — элементами списка и значениями — количеством повторов этих элементов. Иными словами, функция array_count_values() подсчитывает частоту появления значений в списке $List. Пример: $List=array(1, "hello", 1, "world", "hello"); array_count_values($array); // возвращает array(1=>2, "hello"=>2, «world"=>1) Слияние массивов Слияние (конкатенация) массивов - это операция создания массива, состоящего из элементов нескольких других массивов. Слияние массивов -это очень опасная операция, поскольку результат слияния подчиняется своей логике, забыв о которой можно потерять данные. Слияние массивов реализуется при помощи оператора "+" или с помощью функции array_merge(). Слияние списков может осуществляться только с помощью функции array_merge(). Предположим, мы имеем два массива: $A = array("1"=>"первый", "2"=>"Второй"); $B = array("1"=>"первый", "2"=>"Второй"); Теперь сольем данные два массива в один массив $C: $C = $A + $B; Оператор "+" для массивов не коммутативен. Это означает, что $A + $B не равно $B + $A. В результате рассмотренного примера мы получим массив $C следующего вида: "1"=>"Первый", "2"=>"Второй", "3"=>"Третий", "4"=>"Четвертый" А в результате $B + $A мы получим такой массив: "3"=>"Третий", "4"=>"Четвертый", "1"=>"Первый", "2"=>"Второй" При слиянии списков такой метод не работает. Поясним данный факт на примере: Предположим, у нас есть два массива: $A = array(10,11,12); $B = array(13,14,15);
массиве остается элемент первого массива, причем на том же месте. В таком случае нам необходимо использовать функцию array_merge() Функция array_merge() Функция array_merge() призвана устранить все недостатки, присущие оператору "+" для слияния массивов. А именно, она сливает массивы, перечисленные в ее аргументах, в один большой массив и возвращает результат. Если в массивах встречаются одинаковые ключи, в результат помещается пара ключ=>значение из того массива, который расположен правее в списке аргументов. Однако это не затрагивает числовые ключи: элементы с такими ключами помещаются в конец результирующего массива в любом случае. Таким образом, с помощью array_merge() мы можем избавиться от всех недостатков оператора "+" для массивов. Вот пример, сливающий два списка в один: $L1=array(100,200,300); $L2=array(400,500,600); $L=array_merge($L1,$L2); // теперь $L===array(100,200,300,400,500,600); Всегда используйте эту функцию, если вам нужно работать именно со списками, а не с обычными ассоциативными массивами. Получение части массива Для получения части массива можно использовать функцию array_slice() array_slice(array $Arr, int $offset [, int $len]) Эта функция возвращает часть ассоциативного массива, начиная с пары ключ=>значения со смещением (номером) $offset от начала и длиной $len (если последний параметр не задан - до конца массива). Параметры $offset и $len задаются по точно таким же правилам, как и аналогичные параметры в функции substr(). А именно, они могут быть отрицательными (в этом случае отсчет осуществляется от конца массива), и т. д. Вот несколько примеров: $input = array ("a", "b", "c", "d", "e"); $output = array_slice ($input, 2); // "c", "d", "e" $output = array_slice ($input, 2, -1); // "c", "d" $output = array_slice ($input, -2, 1); // "d" $output = array_slice ($input, 0, 3); // "a", "b", "c" Вставка и удаление элементов массивов Мы уже знаем несколько операторов, которые отвечают за вставку и удаление элементов. Например, оператор [] (пустые квадратные скобки) добавляет элемент в конец массива, присваивая ему числовой ключ, а оператор Unset() вместе с извлечением по ключу удаляет нужный элемент. Язык PHP поддерживает и многие другие функции, которые иногда бывает удобно использовать. array_push(alist &$Arr, mixed $var1 [, mixed $var2, …]) Эта функция добавляет к списку $Arr элементы $var1, $var2 и т. д. Она присваивает им числовые индексы — точно так же, как это происходит для стандарных []. Если вам нужно добавить всего один элемент, наверное, проще и будет воспользоваться этим оператором: array_push($Arr,1000); // вызываем функцию… $Arr[]=100; // то же самое, но короче Обратите внимание, что функция array_push() воспринимает массив, как стек, и добавляет элементы всегда в его конец. Она возвращает новое число элементов в массиве. array_pop(list &$Arr) Функция array_pop(), является противоположностью array_push(), снимает элемент с "вершины" стека (то есть берет последний элемент списка) и возвращает его, удалив после этого его из $Arr. С помощью этой функции мы можем строить конструкции, напоминающие стек. Если список $Arr был пуст, функция возвращает пустую строку. array_unshift(list &$Arr, mixed $var1 [, mixed $var2, …]) Функция array_unshift очень похожа на array_push(), но добавляет перечисленные элементы не в конец, а в начало массива. При этом порядок следования $var1, $var2 и т. д. остается тем же, т. е. элементы как бы "вдвигаются" в список слева. Новым элементам списка, как обычно, назначаются числовые индексы, начиная с 0; при этом все ключи старых элементов массива, которые также были числовыми, изменяются (чаще всего они увеличиваются на число вставляемых значений). Функция возвращает новый размер массива. Вот пример ее применения: $A=array(10,"a"=>20,30); array_unshift($A,"!","?"); // теперь $A===array(0=>"!", 1=>"?", 2=>10, a=>20, 3=>30) mixed array_shift(list &$Arr) Функция mixed array_shift извлекает первый элемент массива $Arr и возвращает его. Она сильно напоминает array_pop(), но только получает начальный, а не конечный элемент, а также производит довольно сильную "встряску" всего массива: ведь при извлечении первого элемента приходится корректировать все числовые индексы у всех оставшихся элементов… array_unique(array $Arr) Функция array_unique() возвращает массив, составленный из всех уникальных значений массива $Arr вместе с их ключами. В результирующий массив помещаются первые встретившиеся пары ключ=>значение: $input=array("a" => "green", "red", "b" => "green", "blue", "red"); $result=array_unique($input);
array_splice(array &$Arr, int $offset [, int $len] [, int $Repl]) Функция array_splice, также как и array_slice(), возвращает подмассив $Arr, начиная с индекса $offset максимальной длины $len , но, вместе с тем, она делает и другое полезное действие. А именно, она заменяет только что указанные элементы на то, что находится в массиве $Repl (или просто удаляет, если $Repl не указан). Параметры $offset и $len задаются так же, как и в функции substr() — а именно, они могут быть и отрицательными, в этом случае отсчет начинается от конца массива. Вот некоторые примеры: $input=array("red", "green", "blue", "yellow"); array_splice($input,2); // Теперь $input===array("red", "green") array_splice($input,1,-1); // Теперь $input===array("red", "yellow") array_splice($input, -1, 1, array("black", "maroon"));!
array_splice($input, 1, count($input), "orange");! // Теперь $input===array("red", "orange") ?> Последний пример показывает, что в качестве параметра $Repl мы можем указать и обычное, строковое значение, а не массив из одного элемента. Переменные и массивы compact(mixed $vn1 [, mixed $vn2, …]) Функция compact() упаковывает в массив переменные из текущего контекста (глобального или контекста функции), заданные своими именами в $vn1, $vn2 и т. д. При этом в массиве образуются пары с ключами, равными содержимому $vnN, и значениями соответствующих переменных. Вот пример использования этой функции: $a="Test string"; $b="Some text"; $A=compact("a","b"); // теперь $A===array("a"=>"Test string", "b"=>"Some text") Почему же тогда параметры функции обозначены как mixed? Дело в том, что они могут быть не только строками, но и списками строк. В этом случае функция последовательно перебирает все элементы этого списка, и упаковывает те переменные из текущего контекста, имена которых она встретила. Более того — эти списки могут, в свою очередь, также содержать списки строк, и т. д. Правда, последнее используется сравнительно редко, но все же вот пример: $a="Test"; $b="Text"; $c="CCC"; $d="DDD"; $Lst=array("b",array("c","d")); $A=compact("a",$Lst); // теперь $A===array("a"=>"Test", "b"=>"Text", "c"=>"CCC", "d"=>"DDD") extract(array $Arr [, int $type] [, string $prefix]) Функция extract() производит действия, прямо противоположные compact(). А именно, она получает в параметрах массив $Arr и превращает каждую его пару ключ=>значение в переменную текущего контекста. Создание списка – диапазона чисел range(int $low, int $high) Эта функция очень простая. Она создает список, заполненный целыми числами от $low до $high включительно. Счетчик элементов массива Для подсчета элементов массива предназначена функция count(). Пример использования функции count(): $arr[]=5; $arr[]=4; $arr[]=8; $arr[]=3; $arr[]=8; echo " |
\">Пароль неверный! (Хеш-коды не совпадают)