Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Abs 1:five 2:for 3:one 4:three 5:two 6:uic




Т.е. строки она сортирует в так называемом альфа-бета порядке, попросту говоря – по старшинству первой буквы в алфавите.

Rsort()

Сортировка массива по убыванию.

Синтаксис:

void rsort ( array arr [, int sort_flags ] )

Аналогична функции sort (), только сортирует по убыванию. Выполним тот же скрипт, что и для функции sort (), только вместо sort($arr) поставим rsort($arr).

Результат:

0:5 1:4 2:3 3:2 4:1

 

Asort()

Сортировка ассоциативного массива по возрастанию.

Синтаксис:

void asort ( array arr [, int sort_flags ] )

Функция asort () сортирует массив arr так, чтобы его значения шли в алфавитном (если это строки) или возрастающем (для чисел) порядке. Важное отличие этой функции от функции sort () состоит в том, что при применении функции asort ()сохраняются связи между ключами и соответствующими им значениями, чего нет в функции sort () (там эти связи попросту разрываются).

Пример:

<? $arr = array ( "a" =>"one","b" => "two","c" => "three","d" => "four" ); asort ( $arr ); foreach ( $arr as $key => $val ) { echo ( " $key => $val " ); } ?>

Результат:

d => four a => one c => three b => two

Т.е., как видим, связи "ключ-значение" сохранились.

По умолчанию функция asort () сортирует массив в алфавитном порядке. Значения флагов сортировки sort_flags приведены в описании функции sort ().

Arsort()

Сортировка ассоциативного массива по убыванию.

Синтаксис:

void arsort ( array arr [, int sort_flags ] )

Эта функция аналогична функции asort (), только она упорядочивает массив не по возрастанию, а по убыванию.

Ksort()

Сортировка массива по возрастанию ключей.

Синтаксис:

int ksort ( array arr [, int sort_flags ] )

В этой функции сортировка осуществляется не по значениям, а по ключам в порядке их возрастания.

<? $arr = array ( "a" =>"one","b" => "two","c" => "three","d" => "four" ); ksort ( $arr ); foreach ( $arr as $key => $val ) { echo ( " $key => $val " ); } ?>

Результат:

a => one b => two c => three d => four

 

Krsort()

Сортировка массива по убыванию индексов.

Синтаксис:

int krsort ( array arr [, int sort_flags ] )

То же самое, что и функция ksort (), только упорядочивает массив по ключам в обратном порядке (по убыванию).

Array_reverse()

Расстановка элементов массива в обратном порядке.

Синтаксис:

array array_reverse ( array arr [, bool preserve_keys ] )

Функция array_reverse () возвращает массив, элементы которого следуют в обратном порядке относительно массива arr, переданного в параметре. При этом связи между ключами и значениями сохраняются. Можно еще необязательный параметр preserve_keys сделать true, тогда в обратном порядке переставятся еще и ключи.

Своруем идейку примерчика на эту функцию из php-шного мануала:

<? $arr = array ( "php", 4.0, array ( "green", "red" )); $result = array_reverse ( $arr ); echo "Массив: < br >"; foreach ( $result as $key => $val ) { echo ( " $key => $val < br >" ); } echo( "< br >" ); echo "Сортированный массив: < br >"; $result_keyed = array_reverse ( $arr, false); foreach($result_keyed as $key => $val) { echo ( " $key => $val < br > " ); } ?>

Т.е., что получилось:

В первом случае:

Результат:

Массив: 0 =>Array 1 =>4 2 =>php Сортированный массив: 0 =>Array 1 =>4 2 =>php

А если еще и второй параметр как true засобачить, то вот что выйдет:

Результат:

Массив: 0 =>Array 1 =>4 2 =>php Сортированный массив: 2 =>Array 1 =>4 0 =>php

 

Shuffle()

Перемешивание элементов массива случайным образом.

Синтаксис:

void shuffle ( array arr )

Функция shuffle () перемешивает элементы масиива arr случайным образом.

Natsort()

Выполняет "естественную" сортировку массива.

Синтаксис:

void natsort ( array arr )

С такой сортировкой мы уже встречались, когда работали со строками. Поработаем с ней еще разок. Как помните, под естественной сортировкой понимается сортировка таким образом, когда элементы того, что сортируется располагаются в "понятном" для человека порядке.

Пример:

<? $array1 = $array2 = array ( "pict10.gif", "pict2.gif", "pict20.gif", "pict1.gif" ); echo ( "обычная сортировка:" ); echo ( "< br >" ); sort ( $array1 ); print_r ( $array1 ); echo ( "< br >" ); echo ( "естественная сортировка:" ); echo ( "< br >" ); natsort ( $array2 ); print_r ( $array2 ); ?>

Результат:

обычная сортировка: Array ([0] => pict1.gif [1] => pict10.gif [2] => pict2.gif [3] => pict20.gif) естественная сортировка: Array ([3] => pict1.gif [1] => pict2.gif [0] => pict10.gif [2] => pict20.gif)

Работа с курсором (указатель) массива

end() next() prev() current() key() each()

О функции reset () мы с вами уже говорили. Напомним, что эта функция производит сброс курсора массива, т.е. устанавливает внутренний курсор массива на начало массива и возвращает значение первого элемента.

Функция end () выполняет действие, обратное функции reset () – переносит курсор в конец массива. Синтаксис функции аналогичен синтаксису функции reset ():

End()

Синтаксис:

mixed end ( array array arr )

Next()

Функция next() производит перенос курсора массива вперед на одну позицию.

Синтаксис:

mixed next ( array array arr )

Т.е. эта функция перемещает курсор массива на следующий элемент, при этом возвращая значение элемента, на котором находился курсор до перемещения. Если элементов в массиве больше не осталось, функция возвращает false. При работе с этой функцией надо не забывать про один моментик, а именно: false также возвращается, если курсору повстречается элемент с пустым значением. Так что, если вы хотите работать с массивами, содержащими пустые элементы, то используйте лучше функцию each (), о которой мы поговорим через несколько абзацев.

Prev()

Функция prev () производит перенос курсора назад на одну позицию. Синтаксис и работа функции полностью аналогичны функции next ().

Синтаксис:

mixed prev ( array array arr )

Current()

Для определения текущего элемента массива, без изменения положения курсора, используется функция current ().

Синтаксис:

mixed current ( array array arr )

Функция current () возвращает значение элемента, на котором в данный момент находится курсор массива, при этом не сдвигая курсор. В том случае, если курсор оказался за пределами массива, или массив состоит из пустых элементов, функция возвратит false.

Полным синонимом функции current () является функция pos ().

 

Key()

Функция key () возвращает индекс текущего элемента массива.

Синтаксис:

mixed key ( array array arr )


Ну а теперь поговорим об обещанной функции each ().

Each()

Синтаксис:

array each ( array array arr )

Функция each () возвращает пару "индекс - значение" текущего элемента массива и сдвигает курсор массива на следующий элемент. При этом, как видно, функция возвращает массив, причем он имеет четыре элемента:

1. [1] => "значение"

2. [value] => "значение"

3. [0] => индекс

4. [key] => индекс

Если курсор достиг конца массива, функция возвращает false. Посмотрим, как работает эта функция:

Пример:

<? $name = array ( "maks", "igor", "sergey" ); $each_name = each ( $name ); print_r ( $each_name ); echo( "< br >" ); $each_name = each ( $name ); print_r ( $each_name ); echo( "< br >" ); $each_name = each ( $name ); print_r ( $each_name ); ?>

И что мы получили:

Результат:

Array ([1] => maks [value] => maks [0] => 0 [key] => 0) Array ([1] => igor [value] => igor [0] => 1 [key] => 1) Array ([1] => sergey [value] => sergey [0] => 2 [key] => 2)

 

Функцию each () можно использовать в паре с функцией list () для перебора элементов массива. К примеру, вот так:

Пример:

<? $name = array ( "maks", "igor", "sergey" ); reset ( $name ); while ( list ( $key, $val ) = each ( $name )) { echo ( " $key = $val < br >" ); } ?>

И вот что на выходе:

Результат:

0 = maks 1 = igor 2 = sergey

Функция array_walk()

 


Array_walk()

Достаточно важная функция, позволяющая применять пользовательскую функцию к каждому элементу массива.

Синтаксис:

bool array_walk ( array arr, callback func [, mixed userdata ] )

Как видно из синтаксиса этой функции, она применяет пользовательскую функцию func к каждому элементу массива arr. В пользовательскую функцию передаются два или три аргумента: значение текущего элемента, его индекс и аргумент userdata. Последний аргумент является необязательным. Заметим, что в случае, если func требует более трех аргументов, при каждом ее вызове будет выдаваться предупреждение, и, чтобы они не выдавались, нужно поставить знак " @ " перед функцией array_walk (). Заметим также, что функция func получает значения и индексы массива arr таким образом, что не может их изменять. Если возникает такая необходимость, нужно передавать аргумент arr по ссылке. В этом случае все изменения отразятся в массиве.

Давайте посмотрим, как эта функция применяется. Допустим, мы хотим вывести все элементы массива. Для этого мы должны сначала написать функцию, которая будет их выводить, а затем вызовем ее при помощи функции array_walk ():

Пример:

<? $name = array ( "m"=>"maks", "i"=>"igor", "s"=>"sergey" ); function print_array ( $item, $key ) { echo " $key => $item < br >\n" ; } array_walk ( $name, 'print_array' ); ?>

И что вышло:

Результат:

m=>maks i=>igor s=>sergey


Важное замечание. Вообще говоря, в приведенном выше коде, есть, скажем так неточность. А именно – мы не установили курсор массива в начало массива, и перед тем, как вызывать функцию array_walk () надо вызывать функцию reset () для этой цели, потому что array_walk () начинает работать с того элемента, на котором находится курсор массива.

Давайте теперь возьмем массив, и увеличим значения каждого его элемента на единицу.

Пример:

<? $number = array ( "1"=>"15", "2"=>"20", "3"=>"25" ); function printarray ( $item, $key ) { echo " $key => $item < br >\n" ; } function add_array ( & $item, $key ) // параметр $item передаем по ссылке, так как // его нам надо изменять { $item = $item + 1 ; } echo( "Before:< br >" ); array_walk ( $number, 'printarray' ); echo( "After:< br >" ); array_walk ( $number, 'add_array' ); array_walk ( $number, 'printarray' ); ?>

Результат:

Before: 1=>15 2=>20 3=>25 After: 1=>16 2=>21 3=>26

5. Функции

Определения и вызовы функций

Функция объявляется при помощи ключевого слова function, после которого в фигурных скобках записываются различные операторы, составляющие тело функции:

function MyFunction () { // операторы }

Если функция принимает аргументы, то они записываются как переменные в объявлении функции. Аргумент функции представляет собой переменную, передаваемую в тело функции для дальнейшего использования в операциях. В случае, когда функция принимает больше одного аргумента, эти переменные разделяются запятыми:

function MyFunction ( $var, $var1, $var2 )

Если функция возвращает какое-либо значение, в теле функции обязательно должен присутствовать оператор return:

function MyFunction () { return $ret ; // возвращается значение переменной $ret }

Пример простой функции.

<? function get_sum () { $var = 5; $var1 = 10; $sum = $var + $var1 ; return $sum ; } echo( get_sum ()); // выводит 15 ?>

В этом примере показана функция, вычисляющая сумму двух чисел. Эта функция не принимает ни одного аргумента, а просто вычисляет сумму и возвращает полученный результат. После этого, она вызывается в теле оператора echo для вывода результата в браузер. Модифицируем эту функцию так, чтобы она не возвращала полученный результат, а выводила его в браузер. Для этого достаточно внести оператор echo в тело функции:

<? function get_sum () { $var = 5; $var1 = 10; $sum = $var + $var1 ; echo $sum ; } get_sum (); ?>

Переменные $var и $var1 мы можем объявить как аргументы и в этом случае в теле функции их определять не надо:

<? function get_sum ( $var, $var1 ) { $sum = $var + $var1 ; echo $sum ; } get_sum ( 5,2 ); // выводит 7 ?>

Переменная, содержащая значение, переданное через аргумент, называется параметром функции.

В рассмотренных примерах аргументы функции передаются по значению, т. е. значения параметров изменяется только внутри функции, и эти изменения не влияют на значения переменных за пределами функции:

<? function get_sum ( $var ) // аргумент передается по значению { $var = $var + 5 ; return $var ; } $new_var = 20 ; echo( get_sum ( $new_var )); // выводит 25 echo( "<br> $new_var " ); // выводит 20 ?>

Для того чтобы переменные переданные функции сохраняли свое значение при выходе из нее, применяется передача параметров по ссылке. Для этого перед именем переменной необходимо поместить амперсанд (&):

function get_sum ( $var, $var1, &$var2 )

В этом случае переменные $var и $var1 будут переданы по значению, а переменная $var2 - по ссылке. В случае, если аргумент передается по ссылке, при любом изменении значения параметра происходит изменение переменной-аргумента:

<? function get_sum ( &$var ) // аргумент передается по ссылке { $var = $var + 5 ; return $var ; } $new_var = 20 ; echo( get_sum ( $new_var )); // выводит 25 echo( "<br> $new_var " ); // выводит 25 ?>

Область видимости переменных

Переменные в функциях имеют локальную область видимости. Это означает, что если даже локальная и внешняя переменные имеют одинаковые имена, то изменение локальной переменной никак не повлияет на внешнюю переменную:

<? function get_sum () { $var = 5 ; // локальная переменная echo $var ; } $var = 10 ; // глобальная переменная get_sum (); // выводит 5 (локальная переменная) echo( "<br> $var " ); // выводит 10 (глобальная переменная) ?>

Локальную переменную можно сделать глобальной, если перед ее именем указать ключевое слово global. Если внешняя переменная объявлена как global, то к ней возможен доступ из любой функции:

<? function get_sum () { global $var; $var = 5 ; // изменяем глобальную переменную echo $var ; } $var = 10 ; echo( " $var <br>" ); // выводит 10 get_sum (); // выводит 5 (глобальная переменная изменена) ?>

Доступ к глобальным переменным можно получить также через ассоциативный массив $GLOBALS:

<? function get_sum () { $GLOBALS ["var"] = 20 ; // изменяем глобальную переменную $var echo( $GLOBALS ["var"] ); } $var = 10 ; echo( " $var <br>" ); // выводит 10 get_sum (); // выводит 20 (глобальная переменная изменена) ?>

Массив $GLOBALS доступен в области видимости любой функции и содержит все глобальные перемене, которые используются в программе.

Время жизни переменной

Временем жизни переменной называется интервал выполнения программы, в течение которого она существует. Поскольку локальные переменные имеют своей областью видимости функцию, то время жизни локальной переменной определяется временем выполнения функции, в которой она объявлена. Это означает, что в разных функциях совершенно независимо друг от друга могут использоваться переменные с одинаковыми именами. Локальная переменная при каждом вызове функции инициализируется заново, поэтому функция-счетчик, в приведенном ниже примере всегда будет возвращать значение 1:

function counter () { $counter = 0 ; return ++$counter ; }

Для того, чтобы локальная переменная сохраняла свое предыдущее значение при новых вызовах функции, ее можно объявить статической при помощи ключевого слова static:

function counter () { static $counter = 0 ; return ++$counter ; }

Временем жизни статических переменных является время выполнения сценария. Т. е., если пользователь перезагружает страницу, что приводит к новому выполнению сценария, переменная $counter в этом случае инициализируется заново.

Что такое рекурсия

Рекурсией называется такая конструкция, при которой функция вызывает саму себя. Различают прямую и косвенную рекурсии. Функция называется прямо рекурсивной, если содержит в своем теле вызов самой себя. Если же функция вызывает другую функцию, которая в свою очередь вызывает первую, то такая функция называется косвенно рекурсивной.

Рассмотрим классические примеры использования рекурсии - реализацию операции возведения в степень и вычисление факториала числа. Заметим, что эти примеры являются классическими только из-за их удобства для объяснения понятия рекурсии, однако они не дают выигрыша в программной реализации по сравнению с итерационным способом решения этих задач.

<? function degree ( $x,$y ) { if( $y ) { return $x * degree ( $x, $y - 1 ); } return 1 ; } echo( degree ( 2,4 )); // выводит 16 ?>

Этот пример основан на том, что xy эквивалентно x*x(y-1). В этом коде задача вычисления 24 разбивается на вычисление 2*2³. Затем 2*2³ разбивается на 2*2² и так до тех пор, пока показатель не станет равным нулю.

Итерационный вариант этого примера выглядит так:

<? function degree ( $x,$y ) { for( $result = 1; $y > 0; --$y ) { $result *= $x ; } return $result ; } echo( degree ( 2,4 )); // выводит 16 ?>

Кроме того, что этот код намного легче понять, он еще и более эффективен, поскольку проход цикла обходится "дешевле" вызова функции.

<? function fact ( $x ) { if ( $x < 0 ) return 0 ; if ( $x == 0 ) return 1 ; return $x * fact ( $x - 1 ); } echo ( fact ( 3 )); // выводит 6 ?>

Для отрицательного аргумента функция возвращает нулевое значение, так как факториал отрицательного числа не существует по определению. Для нулевого параметра функция возвращает значение 1, поскольку 0! = 1. В иных случаях вызывается та же функция с уменьшенным на 1 значением параметра, после чего результат умножается на текущее значение параметра. Т. е. происходит вычисление произведения:

k * (k - 1) * (k - 2) *... * 3 * 2 * 1 * 1

Последовательность рекурсивных вызовов прерывается только при вызове fact(0), который и приводит к последнему значению 1 в произведении, так как последнее выражение, из которого вызывается функция, имеет вид 1 * fact (1 - 1).

Итерационно факториал можно вычислить так:

<? function fact ( $x ) { for ( $result = 1; $x > 1; --$x ) { $result *= $x ; } return $result ; } echo ( fact ( 6 )); // выводит 720 ?>

 

 

6. Работа с файлами

Открытие файлов

Файл представляет собой последовательность байтов, хранящуюся на каком-либо физическом носителе информации. Каждый файл имеет абсолютный путь, по которому определяется его местонахождение. В качестве разделителя пути в Windows может использоваться как прямой (/), так и обратный (\) слеш. В других операционных системах используется только прямой слеш.

Открытие файлов в файловой системе сервера производится при помощи функции fopen:

int fopen (string filename, string mode [, int use_include_path ])

Первый аргумент filename - имя файла или абсолютный путь к нему. Если абсолютный путь не указывается, то файл должен находится в текущем каталоге.

Второй аргумент mode говорит о том, для каких действий открывается файл и может принимать следующие значения:

· r (Открыть файл только для чтения; после открытия указатель файла устанавливается в начало файла);

· r+ (Открыть файл для чтения и записи; после открытия указатель файла устанавливается в начало файла);

· w (Создать новый пустой файл только для записи; если файл с таким именем уже есть вся информация в нем уничтожается);

· w+ (Создать новый пустой файл для чтения записи; если файл с таким именем уже есть вся информация в нем уничтожается);

· a (Открыть файл для дозаписи; данные будут записываться в конец файла);

· a+ (Открыть файл для дозаписи и чтения данных; данные будут записываться в конец файла);

· b (Флаг, указывающий на работу (чтение и запись) с двоичным файлом; указывается только в Windows).

Третий необязательный аргумент use_include_path определяет должны ли искаться файлы в каталоге include_path. (Параметр include_path устанавливается в файле php.ini).

В случае удачного открытия файла, функция fopen возвращает дескриптор файла, в случае неудачи - false. Дескриптор файла представляет собой указатель на открытый файл, который используется операционной системой для поддержки операций с этим файлом. Возвращенный функцией дескриптор файла необходимо затем указывать во всех функциях, которые в дальнейшем будут работать с этим файлом.

Код, приведенный ниже, открывает файл C:/WWW/HTML/file.txt для чтения:

<? $file = fopen ( "c:/www/html/file.txt","r" ); if(! file ) { echo( "Ошибка открытия файла" ); } ?>

Открытие двоичного файла, к примеру, рисунка происходит таким же образом, только с флагом b:

<? $file = fopen ( "c:/www/html/river.jpg","rb" ); if(! file ) { echo( "Ошибка открытия файла" ); } ?>

Отображение файлов

Содержимое открытого файла можно отобразить в браузере с помощью функции fpassthru:

int fpassthru (int file )

Аргумент file представляет собой дескриптор файла.

<? $file = fopen ( "c:/www/html/pavlovo.jpg","rb" ); if(! file ) { echo( "Ошибка открытия файла" ); } else { fpassthru ( $file ); } ?>

Для текстовых файлов существует еще одна функция отображения readfile:

readfile (string filename )

Обращаем ваше внимание на то, что в качестве аргумента эта функция принимает имя файла, а не его дескриптор:

<? readfile ( "file.txt" ); ?>

Закрытие файлов

После того, как вы закончите работу с файлом его необходимо закрыть. Закрытие файлов осуществляется с помощью функции fclose:

int fclose (int file )

Аргумент file представляет собой дескриптор файла, который необходимо закрыть.

Чтение из файлов и запись в файлы

Чтение из файлов

Прочитать строку из открытого файла можно с помощью функции fread:

string fread (int file, int length )

Эта функция возвращает строку длиной length символов из файла с дескриптором file.

Пример (чтение из файла):

<? $file = fopen ( "c:/www/html/file.txt","r" ); if(! file ) { echo( "Ошибка открытия файла" ); } else { $buff = fread ( $file,100 ); print $buff ; } ?>

Для чтения из файла можно также пользоваться функцией fgets:

string fgets (int file, int length )

Эта функция читает и возвращает строку длиной length - 1 байт. Чтение прекращается, когда достигнута новая строка или конец файла. При достижении конца файла функция возвращает пустую строку.

Для чтения файла с удалением из него тегов HTML применяется функция fgetss:

string fgetss (int file, int length [, string allowable_tags ])

Необязательный третий параметр allowable_tags может содержать строку со списком тегов, которые не должны быть отброшены, при этом теги в строке записываются через запятую.

Если необходимо записать содержимое файла в массив, применяется функция file:

array file (string filename [, int use_include_path ])

Функция считывает файл с именем filename и возвращает массив, каждый элемент которого соответствует строке в прочитанном файле. В следующем примере с помощью функции читается файл, информация из которого затем выводится в браузер.

<? $file_array = file( "file.txt" ); if( !$file_array ) { echo( "Ошибка открытия файла" ); } else { for( $i = 0; $i < count ( $file_array ); $i++ ) { printf( "%s<br>", $file_array [ $i ] ); } } ?>

Эта функция удобна также тем, что с ее помощью можно легко подсчитать количество строк в файле:

<? $file_array = file ( "file.txt" ); if( !$file_array ) { echo( "Ошибка открытия файла" ); } else { $num_str = count ( $file_array ); echo( $num_str ); } ?>

Заметим, что функцию file следует применять лишь для чтения небольших файлов.

Для чтения файлов с расширением *.csv применяется функция fgetcsv:

array fgetcsv (int file, int length, char delim )

Функция читает строку из файла и разбивает ее по символу delim. Параметр delim должен обязательно быть строкой из одного символа, иначе принимается во внимание только первый символ этой строки. Функция возвращает получившийся массив или false, если достигнут конец файла. Пустые строки в файле не игнорируются, а возвращаются как массив из одного элемента - пустой строки. Параметр length задает максимальную длину строки точно так же, как это делается в функции fgets.

Формат CSV является одним из форматов, в котором может сохранять файлы MSExcel. В следующем примере производится чтение созданного MSExcel файла file.csv, содержащего пароли пользователей.

<? $count = 1; $file = fopen ( "file.csv","r" ); while ( $data = fgetcsv ( $file, 1000, "," )) { $num = count ( $data ); $count ++ ; for ( $i = 0; $i < $num; $i ++ ) { print " $data [ $i ]<br>" ; } } fclose ( $file ); ?>

Запись в файлы

Запись в файлы осуществляется функциями fputs и fwrite, которые абсолютно идентичны:

int fputs ( int file, string string [, int length ]) int fwrite ( int file, string string
Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...