Инициализация массивов В php существует 2 метода инициализации массивов. Первый из них состоит в простом присвоении значений элементам массива: <? $car[] = "passenger car"; $car[] = "land-rover"; echo($car[1]); // выводит "land-rover" ?> Индекс массива можно указать явно: <? $car[0] = "passenger car"; $car[1] = "land-rover"; echo($car[1]); // выводит "land-rover" ?> Заметим, что если при объявлении элементов массива смешиваются переменные с явной индексацией, и без индексации, то тому элементу, индекс которого не задан, php присвоит первый доступный индекс, после самого большого использованного до сих пор индекса. Например, если мы создадим массив с элементами, индексы которых будет равны, скажем, 10, 20 и 30, а потом создадим элемент, индекс которого явно не укажем, то ему автоматически присвоится индекс 31: <? $car[10] = "passenger car"; $car[20] = "land-rover"; $car[30] = "station-wagon"; $car[] = "victoria"; echo($car[31]); ?> Альтернативный способ определения массивов состоит в использовании конструкции array(): <? $car = array("passenger car","land-rover"); echo($car[1]); // выводит "land-rover" ?> Для явного указания индексов в этом случае применяется оператор =>: <? $car = array("passenger car", 5 => "land-rover", "station-wagon","victoria"); echo($car[0]); echo("<br>"); // выводит "passenger car" echo($car[5]); echo("<br>"); // выводит "land-rover" echo($car[6]); echo("<br>"); // выводит "station-wagon" echo($car[7]); // выводит "victoria" ?> Индексами массива могут быть и строки: <? $car = array("pc" => "passenger car", "lr" => "land-rover"); echo($car["lr"]); echo("<br>"); // выводит "land-rover" echo($car["pc"]); // выводит "passenger car" ?> Цикл foreach для обхода массивов Обход массива в цикле в php4 можно организовать при помощи цикла foreach, который имеет следующий синтаксис: foreach (array as [$key =>] $value) { statements; } Смысл этого цикла прост: при проходе каждого элемента массива в переменную $key помещается индекс этого элемента, а в переменную $value – его значение. Имена этих двух переменных совершенно произвольны. Пример: <? $car = array("passenger car", "land-rover", "station-wagon","victoria"); foreach($car as $index => $val) { echo("$index -> $val <br>"); } ?> Как видно из синтаксиса, переменная $key необязательна и может быть опущена: <? echo( "available cars: <br> <ul>" ); $car = array("passenger car", "land-rover", "station-wagon","victoria"); foreach($car as $val) { echo("<li>$val</li>n"); } echo("</ul>"); ?> Многомерные массивы в php Для инициализации многомерных массивов используются вложенные конструкции array(). Обход многомерных массивов достигается при помощи вложенных циклов. В следующем скрипте показан пример создания и обхода многомерного массива. Пример: <? $ship = array( "passenger ship" => array("yacht","liner","ferry"), "war ship" => array("battle-wagon","submarine","cruiser"), "freight ship" => array("tank vessel","dry-cargo ship","container cargo ship") ); foreach($ship as $key => $type) { echo( "<h2>$key</h2>n"."<ul>n"); foreach($type as $ship) { echo("t<li>$ship</li>n"); } } echo("</ul>n"); ?> Результат выполнения этого скрипта:: passenger ship yacht liner ferry war ship battle-wagon submarine cruiser freight ship tank vessel dry-cargo ship container cargo ship Ну а теперь, будем рассматривать функции, которые есть в php для работы с массивами. И первое с чего мы начнем – это функции сортировки массивов. Однако до этого я еще скажу о трех функциях, которыми мы часто будем пользоваться в наших примерах. Функция count() Синтаксис: int count(mixed var) Эта функция принимает в качестве аргумента массив и возвращает количество элементов в нем. Как понимаете, штука незаменимая когда будем бегать по массиву циклом for(). Функция in_array() Синтаксис: boolean in_array(mixed needle, array haystack [, bool strict]) Эта функция ищет в массиве haystack значение needle и возвращает true если оно найдено и false в противном случае. Функция reset() Синтаксис: mixed reset(array array) Функция reset() устанавливает указатель массива на первый элемент и возвращает значение первого элемента массива. Небольшое замечание. У каждого массива в php есть внутренний указатель на текущий элемент массива. При работе с такими конструкциями как foreach не надо думать об указателе, поскольку foreach устанавливает его в начало массива. Однако, многие другие функции массивов, такие как prev(), next(), занимаются перемещением указателя массива, что может иметь значение при работе с такими функциями, как array_walk(), которые начинают обработку массива с того места, где находится указатель. Ну а теперь вплотную займемся сортировками. sort() Функция сортировки массива по возрастанию. Синтаксис: void sort(array array [, int sort_flags]) Функция сортирует массив array по возрастанию. Необязательный аргумент sort_flags указывает как именно должны сортироваться элементы (задает флаги сортировки). Допустимыми значениями этого аргумента являются следующие: sort_regular – задает нормальное сравнение элементов (сравнивает элементы "как есть") sort_numeric - сравнивает элементы как числа sort_string - сравнивает элементы как строки Вообще говоря, эта функция предназначена для сортировки списков. Под списком понимается массив, ключи которого начинаются с нуля и не имеют пропусков. Функция sort() воспринимает любой массив как список. Рассмотрим примерчик. Пример: <? $arr = array("2", "1", "4", "3","5"); sort($arr); for($i=0; $i < count($arr); $i++) { echo ("$i:$arr[$i] "); } // выводит "0:1 1:2 2:3 3:4 4:5" ?> Результат: 0:1 1:2 2:3 3:4 4:5 Заметим такую вещь. Если вы сортируете строки, т.е, к примеру, массив выглядит вот так array("one", "two", "abs", "three", "uic", "for","five"); то эта чудо-функция вернет вам следующее: Результат: 0: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] => "значение" [value] => "значение" [0] => индекс [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
|