На главную Назад
Добро пожаловать, уважаемый посетитель!

 

ГЛАВА 5

Массивы

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

В этой главерассматриваются различные средства РНР поработе с массивами. К концу этой главы выпознакомитесь с одномерными и многомернымимассивами, сортировкой и переборомэлементов, а также с другими возможностями,часто используемыми при работе с массивами.Книгу не стоит рассматривать как подробныйсправочник по всем существующим функциям,хотя так уж получилось, что в этой главерассматриваются практически все функциимассивов. Последнюю версию списка функцийможно найти на домашней странице РНР поадресу http://www.php.net.

Созданиемассивов

Массив представляетсобой совокупность объектов, имеющиходинаковые размер и тип. Каждый объект вмассиве называется элементоммассива. Создать новыймассив в РНР несложно. При объявлениииндексируемого массива после именипеременной ставится пара квадратных скобок([ ]):

$languages [ ] = "Spanish"; 

// $languages[0] = "Spanish"

После этогов массив можно добавлять новые элементы,как показано ниже. Обратите внимание: новыеэлементы добавляются без явного указанияиндекса. В этом случае новый элементдобавляется в позицию, равную длине массиваплюс 1:

$languages[ ] = "English";// $1anguages[l] = "English"; 

$languagest ] = "Gaelic"; //$languages[2] = "Gaelic";

Кроме того,новые элементы можно добавлять вконкретную позицию массива. Для этогоуказывается индекс нрвого элемента:

$languages[15] = "Italian"; 

$languages[22] = "French";

Ассоциативныемассивы создаются аналогичным образом:

$languages["Spain"]= "Spanish"; 

$languages["France"] = "French";

При созданиимассивов используются три стандартныеязыковые конструкции:

  • аrrау( );
  • list( );
  • range( ).

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

аггау( )

Функцияarray( ) получает ноль или более элементови возвращает массив,состоящий из указанных элементов. Еесинтаксис:

arrayarray ( [элемент1, элемент2...] )

Вероятно, array()является всего лишь более нагляднойзаписью для создания массива, используемойдля удобства программиста. Ниже показанпример использования array( ) для созданияиндексируемого массива:

$languages = array("English". "Gaelic". "Spanish");

// $languages[0] ="English". $languages[1] = "Gaelic",

// $languages[2] ="Spanish"

А вот как array()используется при создании ассоциативныхмассивов:

$languages = array("Spain"=> "Spanish",

"Ireland"=> "Gaelic".

"United States"=> "English");

// $languages["Spain"] = "Spanish"

// $languages["Ireland"] = "Gaelic"

// $languages["UnitedStates"] = "English"

Ассоциативныемассивы особенно удобны в тех ситуациях,когда числовые индексы не имеютлогического соответствия. Например, впредыдущем примере названия стран вполнеестественно ассоциируются с языками.Попробуйте-ка воплотить эту логическуюсвязь при помощи цифр!

list( )

Конструкцияlist( ) похожа на аrrау( ), однако ее главнаязадача - одновременное присваиваниезначений, извлеченных из массива, сразунескольким переменным. Синтаксис командыlist( ):

voidlist (переменная1 [. переменная2 , ...] )

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

профессия илюбимый цвет); компоненты записиразделяются вертикальной чертой (|).Типичная строка выглядит так:

Nino Sanzi|ProfessionalGolfer|green

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

// Читатьстроки, пока не будет достигнут конец файла 

while ($line = fgets ($user_file. 4096)) :

// Разделитьстроку функцией split( ).

// Компонентыприсваиваются переменным Sname. $occupation и Scolor.

list ($name,$occupation, $color) = split( "|", $line);

//Отформатировать и вывести данные

print "Name: Sname<br>";

print "Occupation:Soccupation <br>";

print "Favoritecolor: Scolor <br>";

endwhile;

Каждаястрока файла читается, форматируется ивыводится в следующем виде:

Name: Nino Sanzi

Occupation:Professional Golfer

Favorite color: green

Вприведенном примере применение list( ) зависитот разделения строки на элементы функциейsplit( ). Элементы, полученные в результатеделения, присваиваются, соответственно,переменным $name, $occupation и $color. Дальше всесводится к форматированию данных длявывода в конкретном браузере. Удобныесредства лексического анализа текстовыхфайлов являются одной из сильных сторон РНР.Эта тема подробно рассматривается в главах7 и 8.

range ( )

Конструкцияrange( ) позволяет легко и быстро создатьмассив целых чисел из интервала,определяемого верхней и нижней границами.Range( ) возвращает массив, состоящий из всехцелых чисел указанного интервала.Синтаксис range( ):

array range (int нижняя_граница,int верхняя граница)

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

$lottery = range(0,9);

// $lottery = array(0,1,2,3,4,5,6,7,8,9)

Как видно изприведенного фрагмента, в параметрах range( )был указан интервал от 0 до 9 и массив $lotteryбыл заполнен целыми числами из этогоинтервала.

Многомерныемассивы

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

$chessboard [1] [4] ="King"; // Двухмерный массив

$capitals["USA"]["Ohio"] = "Columbus": // Двухмерный массив

$streets["USA"]["Ohio"]["Columbus"] = "Harrison";// Трехмерный массив

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

$desserts = аrrау(

"Fruit Cup"=> array (

"calories"=> "low",

"served" -> "cold",

"preparation"=> "10 minutes"

),

"Brownies"=> array (

"calories"-> "high",

"served" => "piping hot",

"preparation"=> "45 minutes"

)

);

Послесоздания массива к его элементам можнообращаться по соответствующим ключам:

$desserts["FruitCup"]["preparation"] // возвращает "10 minutes"

$desserts["Brownies"]["calories"] // возвращает"high"

Присваиваниезначений элементам многомерных массивоввыполняется так же, как и в одномерныхмассивах:

$desserts["Cake"]["calories"]= "too many";

//Присваивает свойству "calories" объекта"Cake" значение "too many"

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

Ссылки намногомерные массивы

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

print "Browniesare good, but the calories content is ".

$desserts["Brownies"]["calories"];

Во-вторых,ссылку на элемент многомерного массиваможно заключить в фигурные скобки ({ }):

print "Browniesare good, but the calories content is

{$desserts[Brownies][calories]}";

Обратитевнимание на отсутствие кавычек вокругключей. Также следует помнить, что междуфигурными скобками и ссылкой не должно бытьлишних пробелов. Если хотя бы одно из этихусловий не выполняется, произойдет ошибка.Впрочем, годятся оба способа. Я рекомендуювыбрать один формат и придерживаться его,чтобы ваши программы выглядели болеепоследовательно. Если неиспользовать какой-либоиз этих способов форматирования, ссылки намногомерные массивы будутинтерпретироваться буквально, чтонаверняка приведет к непредвиденнымрезультатам.

Поискэлементов массива

Поискэлементов относится к числу важнейшихопераций с массивами. В РНР существуетнесколько стандартных функций, позволяющихлегко находить в массиве нужные ключи изначения.

in_array( )

Функция in_array ( ) проверяет, присутствует ли в массивезаданный элемент. Если поиск окажетсяудачным, функция возвращает TRUE, в противномслучае возвращается FALSE. Синтаксис функцииin_array( ):

bool in_array(mixed элемент,array массив)

Эта функцияособенно удобна тем, что вам не приходится вцикле перебирать весь массив в поискахнужного элемента. В следующем примерефункция in_array( ) ищет элемент "Russian" вмассиве $languages:

$languages = array("English","Gaelic", "Spanish"):

$exists = in_array("Russian",$languages); // $exists присваивается FALSE

$exists = in_array("English",$languages): // $exists присваивается TRUE

Функция in_array()часто встречается в управляющихконструкциях, когда ее возвращаемоезначение (TRUE/FALSE) используется для выбораодного из двух вариантов продолжения. Вследующем примере функция in_array( )используется для выбора одного из двухвариантов в условной команде if:

// Вводданных пользователем

$language = "French"; $email ="wjgilmore@hotmail.com";

// Если язык присутствуетв массиве

if (in_array($language.$languages)) :

// Подписатьпользователя на бюллетень.

// Обратитевнимание: в РНР нет стандартной функции сименем

// subscribe_user(). Вданном примере эта функция простоимитирует

// процессподписки.

subscribe_user($email,$language);

print "You are nowsubscribed to the $language edition of the newsletter.";

// Языкотсутствует в массиве

else :

print "We're sorry,but we don't yet offer a $language edition of the newsletter".

endif;

Чтопроисходит в этом примере? Допустим,переменные $language и $email содержат данные,введенные пользователем. Вы хотитеубедиться в том, что указанный языкподдерживается вашей системой, ииспользуете для этой цели функцию in_array( ).Если название языка присутствует в массиве,пользователь подписывается на бюллетень иполучает соответствующее сообщение. Впротивном случае программа сообщает, что науказанном языке бюллетень нераспространяется. Конечно, в настоящейпрограмме пользователь не должен гадать,какие языки поддерживаются вашейпрограммой. Задача решается при помощираскрывающегося списка - эта тема подробнорассматривается в главе 10. Здесь этотпример всего лишь демонстрируетвозможности работы с массивами.

array_keys( )

Функцияarray_keys( ) возвращает массив, содержащий всеключи исходного массива, переданного вкачестве параметра. Если при вызовепередается дополнительный параметрискомый_элемент, возвращаются только ключи,которым соответствует заданное значение; впротивном случае возвращаются все ключимассива. Синтаксис функции array_keys( ):

array array_keys (array массив[, mixed искомый_элемент])

Рассмотримпример использования функции array_keys( ) дляполучения ключа заданного элемента:

$great_wines = array("Australia" => "Clarendon Hills 96",

"France"=> "Comte George de Vogue 97",

"Austria" => "FeilerArtinger 97");

$great_labels = array_keys($great_wines);

// $great_labels =array("Australia", "France", "Austria");

$great_labels =array_keys($great_wines, "Clarendon Hills 96");

// $great_labels =array("Australia");

Функцияarray_keys( ) позволяет очень легко получить всеключи ассоциативного массива - например, впредыдущем случае ими были названия стран,в которых производятся различные сорта вин.

array_values( )

Функцияarray_values( ) возвращает массив, состоящий извсех значений исходного массива,переданного в качестве параметра.Синтаксис функции array_values( ):

array array_values(array массив)

Вернемся кпредыдущему примеру, в котором функцияarray_keys( ) использовалась для получения всехзначений ключей. На этот раз функция array_values()возвращает все значения, соответствующиеключам:

// $great_wines = array("Australia" => "Clarendon Hills 96",

// "France"=> "Comte George de Vogue 97",

// "Austria" => "FeilerArtinger 97");

$great_labels =array_values($great_wines);

// $great_labels = аrrау("ClarendonHills 96",

// "Comte Georgede Vogue 97",

// "FeilerArtinger 97");

Функцииarray_keys( ) и array_values( ) дополняют друг друга,позволяя при необходимости получить всесоставляющие той или иной стороныассоциативного массива.

Добавление иудаление элементов

К счастью, вРНР при создании массива не нужно указыватьмаксимальное количество элементов. Этоувеличивает свободу действий при операцияхс массивами, поскольку вам не приходитсябеспокоиться о случайном выходе за границымассива, если количество элементовпревысит ожидаемый порог. В РНР существуетнесколько функций для увеличения размеровмассива. Некоторые из них были созданы дляудобства программистов, привыкших работатьс различными типами очередей и стеков (FIFO,FILO и т. д.), что отражается в названияхфункций (push, pop, shift и unshift). Но даже если вы незнаете, что такое <очередь> или <стек>, неогорчайтесь - в этих функциях нет ничегосложного.

Очередью(queue) называется структура данных, изкоторой элементы извлекаются в порядкепоступления. Стеком (stack) называетсяструктура данных, из которой элементыизвлекаются в порядке, обратном порядку ихпоступления.

array_push( )

Функцияarray_push( ) присоединяет (то есть дописывает вконец массива) один или несколько новыхэлементов. Синтаксис функции array_push( ):

int array_push(array массив, mixed элемент[,...])

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

$languages = array("Spanish","English", "French");

array_push($languages, "Russian","German", "Gaelic");

// $languages = array("Spanish","English", "French",

// "Russian", "German","Gaelic")

У функцииarray_push( ), как и у многих стандартных функцийРНР, существует <двойник> - функция аrrау_рор(),предназначенная для извлечения элементовиз массива. Главное различие между этимифункциями заключается в том, что array_push( )может добавлять несколько элементоводновременно, а аrrау_рор( ) удаляет элементытолько по одному.

аrrау_рор( )

Результатработы функции аrrау_рор( ) прямопротивоположен array_push( ) - эта функцияизвлекает (то есть удаляет) последнийэлемент из массива. Извлеченный элементвозвращается функцией. Синтаксис функции аrrау_рор():

аrrау_рор(аrrау массив)

При каждомвыполнении аrrау_рор( ) размер массивауменьшается на 1. Рассмотрим пример:

$languages = array("Spanish","English", "French",

"Russian","German", "Gaelic");

$a_language = array_pop($languages):// $a_language = "Gaelic"

$a_language = array_pop($languages)://$a_language = "German"

// $languages = array ("Spanish","English", "French", "Russian");

Функцииarray_push( ), и array_pop( ) удобны тем, что с их помощьюможно выполнять операции с элементами иуправлять размером массива, не беспокоясь онеинициализированных или пустых элементах.Такое решение работает намного эффективнее,чем любые попытки управления этимифакторами со стороны программиста.

array_shift( )

Функцияarray_shift( ) аналогична аrrау_рор( ) с однимотличием: элемент удаляется из начала (левогокрая) массива. Все остальные элементымассива сдвигаются на одну позицию к началумассива. У функции array_shift( ) такой жесинтаксис, как и у аггау_рор( ):

array_shift(array массив)

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

$languages = array("Spanish","English", "French", "Russian");

$a_language =array_shift($languages); // $a_language = "Spanish";

// $languages =array("English", "French", "Russian");

array_unshift( )

Функцияarray_unshift( ) дополняет array_shift( ) - новый элементвставляется в начало массива, а остальныеэлементы сдвигаются на одну позицию вправо.Синтаксис команды array_unshift( ):

1nt array_unshift(array массив, mixed переменная1[....переменная2])

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

$languages = array("French","Italian", "Spanish");

array_unshift($languages,"Russian", "Swahili", "Chinese");

// $languages = array("Russian","Swahili", "Chinese",

// "French","Italian", "Spanish");

array_pad( )

Функцияarray_pad( ) позволяет быстро увеличить массив дожелаемого размера посредством егодополнения стандартными элементами.Синтаксис функции array_pad( ):

array arrap_pad(array массив,int размер, mixed значение):

Параметр размеропределяет новую длинумассива. Параметр значениезадает стандартноезначение, присваиваемое элементам во всехновых позициях массива. При использованииarray_pad( ) необходимо учитывать некоторыеобстоятельства:

Если размерположителен, массивдополняется справа, а если отрицателен -слева.

Еслиабсолютное значение параметра размерменьше либо равно длинемассива, никаких действий не выполняется.

Абсолютнымзначением (модулем) целого числа называетсяего значение без знака. Например,абсолютное значение чисел 5 и -5 равно 5.

Примердополнения массива с конца:

$weights = array(1, 3,5, 10, 15, 25, 50);

$weights = array_pad($weights.10, 100);

// Результат:$weights = array(1, 3, 5, 10, 15, 25, 50, 100, 100, 100);

Примердополнения массива с начала:

$weights = array(1, 3,5, 10, 15, 25, 50);

$weights = array_pad($weights,-10, 100);

// Результат:$weights = array(100, 100, 100, 1, 3, 5, 10, 15, 25, 50);

Неправильнаяпопытка дополнения массива:

$weights = array(1, 3,5, 10, 15, 25, 50);

$weights = array_pad($weigtits, 3, 100);

// Массив$weights не изменяется:

// $weights = array(1, 3, 5, 10, 15, 25,50);

Переборэлементов

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

reset( )

Функцияreset( ) переводит внутренний указательтекущей позиции в массиве к первомуэлементу. Кроме того, она возвращаетзначение первого элемента. Синтаксисфункции reset( ):

mixed reset (array массив)

Рассмотримследующий массив:

$fruits = array("apple","orange", "banana");

Допустим,указатель текущей позиции в этом массивеустановлен на элемент "orange". Команда:

$a_fruit = reset($fruits);

вернетуказатель в начало массива, то есть наэлемент "apple", и вернет это значение,если результат вызова reset( ) используется впрограмме. Возможен и упрощенный вариантвызова:

reset($fruits);

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

each ( )

Функцияeach( ) при каждом вызове выполняет двеоперации: она возвращает пару <ключ/значение>,на которую ссылается указатель текущейпозиции, и перемещает указатель кследующему элементу. Синтаксис функции each():

array each (array массив)

Для удобстваeach ( ) возвращает ключ и значение в видемассива из четырех элементов; ключами этогомассива являются 0, 1, value и key. Возвращаемыйключ ассоциируется с ключами 0 и key, авозвращаемое значение - с ключами 1 и value.

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

// Объявитьмассив из пяти элементов

$spices = array("parsley","sage", "rosemary", "thyme", "pepper");

// Установитьуказатель на первый элемент массива

reset($spices);

// Создатьмассив $a_sp1ce. состоящий из четырех элементов

$a_spice = each($spices);

В результатевыполнения приведенного фрагмента массив$a_spice будет содержать следующие пары <ключ/значение>:

  • 0 => 0;
  • 1 => "parsley";
  • key => 0;
  • value => "parsley".

После этогостроку "parsley" можно вывести любой изследующих команд:

print $a_spice[1]:print $a_spice["value"];

Функция each()обычно используется в сочетании с list( ) вциклических конструкциях для перебора всехили некоторых элементов массива. При каждойитерации each( ) возвращает либо следующуюпару <ключ/значение>, либо логическую ложьпри достижении последнего элемента массива.Вернемся к массиву $spices; чтобы вывести всеэлементы на экран, можно воспользоватьсяследующим сценарием:

// Сброситьуказатель текущей позиции

reset($spices);

// Перебратьпары "ключ/значение", ограничиваясьвыводом значения

while (list ($key, $val)= each ($spices) ) :

print "$val <br>"

endwhile;

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

Листинг5.1. Построениетаблицы HTML по содержимому массива

// Объявитьассоциативный массив стран и языков $languages =array ("Country" => "Language",

"Spain" =>"Spanish",

"USA" =>"English",

"France"=> "French",

"Russia"=> "Russian");

// Начатьновую таблицу

print "<table border=l>";

//Переместить указатель к позиции первогоэлемента

reset ($languages);

// Прочитатьпервый ключ и элемент

$hdl = key ($languages);

Shd2 = $languages[$hd1];

// Вывестипервый ключ и элемент в виде заголовковтаблицы

print "<tr><th>$hd1</th><th>$hd2</th></tr>";

next($languages);

// Выводитьстроки таблицы с ключами и элементамимассива

while (list ($ctry,$lang) = each($languages)) :

print "<tr><td>Sctry</td><td>$lang</td></tr>";

endwhile;

// Завершитьтаблицу print "</table>";

?>

В результатевыполнения этого кода будет построенаследующая таблица HTML.

Country

Language

SpainSpanish
USA English
FranceFrench
RussiaRussian

Этот примердает представление о самой сильной сторонеРНР - возможности объединениядинамического кода с HTML для получениянаглядного, отформатированногопредставления прочитанных данных.

end( )

Функцияend( ) перемещает указатель к позициипоследнего элемента массива. Синтаксисфункции end( ):

end (array массив)

next( )

Функция next ( )смещает указатель на одну позицию вперед,после чего возвращает элемент, находящийсяв новой позиции. Если в результате смещения

указательвыйдет за пределы массива, next ( ) возвращаетложное значение. Синтаксис функции next ( ):

mixed next (array массив)

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

prev( )

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

mixed prev (array массив)

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

array_walk( )

Функцияarray_walk( ) позволяет применить функцию кнескольким (а возможно, всем) элементаммассива. Синтаксис функции array_walk( ):

int array_walk(arrayмассив, string имя_функции [, mixed данные])

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

function delete_dupes($element){

static $last="";if ($element == $last)

unset($element); else .''

$last=$element:

}

$emails = array("blah@blah.com","chef@wjgilmore.com", "blah@blah.com");

sort($emails);

reset($emails);

array_walk($emails,"delete_dupes");

// $emails = array("chef@wjgilmore.com","blah@blah.com");

array_reverse( )

Функцияarray_reverse( ) позволяет легко перейти кпротивоположному порядку элементов,составляющих массив. Синтаксис функцииarray_reverse( ):

array array_reverse(array массив)

Рассмотримпример использования функции array_reverse( ):

$us_wireproducers =array ("California", "Oregon", "New York". "Washington");

$us_wine_producers -array_reverse (Sus_wine_producers);

// $us_wine_producers =array ("Washington". "New York", "Oregon". "California");

При вызовеarray_reverse( ) для ассоциативного массива пары <ключ/значение>сохраняются, изменяется только порядокэлементов массива.

array_flip( )

Функцияarray_flip( ) меняет местами ключи и значенияэлементов массива. Синтаксис функции array_flip():

array array_flip(array массив)

В следующемпримере функция array_flip( ) меняет местами всеключи и значения элементов:

$languages = array("Spain"=> "Spanish", "France" => "French", "Italy"=> "Italian");

$languages = array_flip($languages);

// $languages = array("Spanish"=> "Spain", // "French" => "France", //"Italian" => "Italy");

Помните:функция array_flip( ) неизменяет порядокэлементов массива. Для этой целииспользуется функция array_reverse( ).

Размермассива

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

$us_wine_producers = array ("Washington". "New York", "Oregon", "California");

for (Si = 0; Si < sizeof($us_wine_producers); $i++) :

print "$us_wine_producers[$i]";

endfor;

Посколькумассив $us_wine_producers индексируется целымичислами, мы можем воспользоваться циклом forдля циклического увеличения переменной-счетчика($i) и вывода каждого элемента в массиве.

sizeof( )

Функция sizeof () возвращает количество элементов вмассиве. Синтаксис функции sizeof ( ):

int sizeof (array массив)

Вероятно,функция sizeof ( ) будет часто встречаться вваших web-приложениях. Ниже приведен краткийпример ее использования (кстати, предыдущийпример тоже относится к числу стандартныхприменений sizeof ( )):

$pasta = array("bowties","angelhair", "rigatoni");

$pasta_size = sizeof($pasta);

//$pasta_size = 3

У функцииsizeof ( ) существует и другая, расширеннаяформа - count ( ) (см. ниже).

count( )

Функцияcount( ) выполняет ту же операцию, что и sizeof ( ), -она возвращает количество значений,содержащихся в массиве. Синтаксис функцииcount ( ):

int count (mixed переменная)

Единственноеразличие между sizeof ( ) и count( ) заключается втом, что в некоторых ситуациях count ( )возвращает дополнительную информацию:

  • еслипеременная существует и является массивом,count ( ) возвращает количество элементов вмассиве;
  • еслипеременная существует, но не являетсямассивом, функция возвращает значение 1;
  • еслипеременная не существует, возвращаетсязначение 0.

array_count_values( )

Функцияarray_count_values( ) является разновидностью sizeof ( ) иcount ( ). Вместо общего количества элементовона подсчитывает количество экземпляровкаждого значения в массиве. Синтаксисфункции array_count_values( ):

array array_count_values(arrayмассив):

Ввозвращаемом массиве ключами будутзначения исходного массива, а значениями -их частоты:

$states = аrrау("ОН","ОК", "СА", "РА", "ОН", "ОН","РА", "АК");

$state_freq =array_count_values($states);

Массив$state_freq заполняется следующимиассоциативными парами <ключ/значение>:

$state_freq = аrrау("ОН" => 3, "ОК" => 1,"СА" => 1, "РА" => 2, "АК" => 1);

Сортировкамассивов

Сортировказанимает важное место в программировании ичасто встречается на практике в такихИнтернет-приложениях, как коммерческиесайты (сортировка категорий товаров валфавитном порядке, сортировка цен) илипоисковые системы (сортировка программ поколичеству загрузок). В РНР существуетдевять стандартных функций сортировки (табл.5.1), причем каждая функция сортирует массивособым образом.

Таблица5.1. Функциисортировки

Функция

Сортировка

Обратныйпорядок

Сохранениепар <ключ/значение>

sort

Значение

Нет

Нет

rsort

Значение

Да

Нет

asort

Значение

Нет

Да

arsort

Значение

Да

Да

ksort

Ключ

Нет

Да

krsort

Ключ

Да

Да

usort

Значение

?

Нет

uasort

Значение

?

Да

uksort

Ключ

?

Да

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

Сортировкаэлементов массива не ограничиваетсястандартными критериями, поскольку трифункции (usort(), uasort( ) и uksort( )) позволяют задатьпользовательский критерий и отсортироватьинформацию произвольным образом.

sort( )

Простейшаяфункция sort( ) сортирует элементы массива повозрастанию (от меньших к большим).Синтаксис функции sort ( ):

void sort (array массив)

Нечисловыеэлементы сортируются в алфавитном порядкев соответствии с ASCII-кодами. Следующийпример демонстрирует применение функции sort() при сортировке:

// Создатьмассив городов.

$cities = array("Aprilia","Nettuno", "Roma", "Venezia", "Anzio");

//Отсортировать города по возрастанию

sort($cities);

// Перебратьсодержимое массива и вывести все пары "ключ/значение".

for (reset($cities); $key = key ($cities); next($cities)):

print("cities[$key]= $cities[$key] <br>";

endfor;

Этотфрагмент выводит следующий результат:

cities[0] = Anzio

cities[1] = Aprilia

cities[2] = Nettuno

cities[3] = Roma

cities[4] = Venezia

Как видите,массив $cities сортируется в алфавитномпорядке. Одна из разновидностей этогоспособа сортировки реализована в функцииasort( ), описанной ниже.

rsort( )

Функция rsort ()работает точно так же, как функция sort ( ), заодним исключением: элементы массивасортируются в обратном порядке. Синтаксисфункции rsort ( ):

void rsort (array массив)

Вернемся кмассиву $cities из предыдущего примера:

$cities array("Aprilia","Nettuno", "Roma", "Venezia", "Anzio");

rsort($cities);

В результатесортировки массива $cities функцией rsort( )элементы будут расположены в следующемпорядке:

cities[0] = Venezia

cities[1] = Roma

cities[2] = Nettuno

cities[3] = Aprilia

cities[4] = Anzio

Массив $citiesтакже сортируется, но на этот раз в порядке,обратном алфавитному. Одна изразновидностей этого способа сортировкиреализована в функции arsort( ), описанной ниже.

asort( )

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

void asort(array массив)

Вернемся кмассиву $cities:

$cities = array("Aprilia","Nettuno", "Roma", "Venezia", "Anzio");

asort($cities):

В результатесортировки массива $cities функцией rsort()элементы будут расположены в следующемпорядке:

cities[4] = Anzio

cities[0] = Aprilia

cities[1] = Nettuno

cities[2] = Roma

cities[3] = Venezia

Обратитевнимание на индексы и сравните их сприведенными в описании функции sort ( ).Именно в этом и состоит различие междудвумя функциями.

arsort( )

Функция arsort( ) представляет собой разновидность asort( ),которая сохраняет исходную ассоциациюиндексов, но сортирует элементы в обратномпорядке. Синтаксис функции arsort( ):

void arsort (arrayмассив)

Воспользуемсяфункцией arsort( ) для сортировки массива $cities:

$cities = array("Aprilia","Nettuno", "Roma", "Venezia", "Anzio");

arsort($cities);

В результатесортировки элементы будут расположены вследующем порядке:

cities[3] = Venezia

cities[2] = Roma

cities[l] = Nettuno

cities[0] = Aprilia

cities[4] = Anzio

Обратитевнимание на индексы и сравните их сприведенными в описании функции rsort( ).Именно в этом и состоит различие междудвумя функциями.

ksort( )

Функцияksort( ) сортирует массив по ключам, сохраняяисходные ассоциации ключей со значениями.Синтаксис функции ksort( ):

void ksort (array массив)

Для примерарассмотрим массив, слегка отличающийся отисходного массива

$cities:

$wine_producers = array("America" => "Napa Valley",

"Italy" =>"Tuscany",

"Australia" => "Ruthgerlen",

"France"=> "Loire",

"Chile" => "Rapel Valley");

В результатесортировки массива функцией ksort( ) элементыбудут расположены в следующем порядке:

"America"=> "Napa Valley"

"Australia" => "Ruthgerlen"

"Chile" => "Rapel Valley"

"France" => "Loire"

"Italy" => "Tuscany"

Сравните срезультатами сортировки $wine_producers функциейsort ( ):

"America"=> "Napa Valley"

"Australia" => "Tuscany"

"Chile" => "Ruthgerlen"

"France" => "Loire"

"Italy" => "Rapel Valley"

Более чемсомнительный результат!

krsort( )

Функцияkrsort( ) почти аналогична ksort( ), однако ключисортируются в обратном порядке. Синтаксисфункции krsort( ):

void krsort (array $массив)

Рассмотримсортировку массива $wi reproducers функцией krsort( ):

$wine_producers = array("America" => "Napa Valley",

"Italy" =>"Tuscany",

"Australia"=> "Ruthgerlen",

"France"=> "Loire".

"Chile" =>"Rapel Valley");

krsort($wine_producers);

В результатесортировки элементы будут расположены вследующем порядке:

"Italy" =>"Tuscany"

"France" => "Loire"

"Chile" =>"Rapel Valley"

"Australia" => "Ruthgerlen"

"America" => "Napa Valley"

Вероятно,описанных выше функций сортировки будетвполне достаточно для большинства случаев.Тем не менее, в некоторых ситуациях можетвозникнуть необходимость в определениисобственных критериев сортировки. В РНРтакая возможность реализована в трехстандартных функциях: usort( ), uasort( ) и uksort( ).

usort( )

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

void usort (array массив,string имя_функции)

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

Листинг5.2. Определениекритерия сортировки для функции usort( )

$vocab = аrrау("Socrates", "Aristophanes", "Plato", "Aeschylus","Thesmophoriazusae");

function compare_length($str1, $str2) {

// Получитьдлину двух следующих слов

$length1 = strlen($str1);

$length2 = strlen($str2);

// Определить,какая строка имеет меньшую длину

if ($length1 ==$length2) :

return 0;

elseif($length1 < $length2) :

return -1;

else :

return 1;

endif;

}

// Вызвать usort()с указанием функции compare_length()

// в качествекритерия сортировки

usort ($vocab, "compare_length"):

// Вывестиотсортированный список

while (list ($key, $val)= each ($vocab)) {

echo "$val<br>";

}

В листинге 5.2функция compare_length ( ) определяет критерийсортировки массива. В данном случае этоделается посредством сравнения длиныпередаваемых элементов. Функция-критерийдолжна получать два параметра,представляющих

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

Функции uasort()и uksort( ) представляют собой разновидности usort()с тем же синтаксисом. Функция uasort()сортирует массив по пользовательскомукритерию с сохранением ассоциаций <ключ/значение>.Функция uksort( ) также сортирует массив попользовательскому критерию, однакосортируются не значения, а ключи.

Другиеполезные функции

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

array_merge( )

Функцияarrayjnerge( ) сливает от 1 до N массивов, объединяяих в соответствии с порядком перечисления впараметрах. Синтаксис функции array_merge( ):

array array_merge(arrayмассив1,array массив2, ..., array массивN]

Рассмотримпример простого объединения массивовфункцией arrayjnerge( );

$arr_1 = array("strawberry","grape", "lemon");

$arr_2 = array("banana", "cocoa","lime");

$arr_3 = array("peach", "orange");

$arr_4 = array_merge($arr2, $arr_1, $arr_3):

// $arr_4 = array("banana", "cocoa","lime", "strawberry", "grape", "lemon","peach", "orange");

array_slice( )

Функцияarray_slice( ) возвращает часть массива, начальнаяи конечная позиция которой определяетсясмещением от начала и необязательнымпараметром длины. Синтаксис функции array_slice():

array array_slice(arrayмассив, intсмещение [, int длина])

Значенияпараметров задаются по определеннымправилам:

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

array_splice( )

Функцияarray_spl ice( ) отдаленно напоминает array_slice( ) - оназаменяет часть массива, определяемуюначальной позицией и необязательной длиной,элементами необязательного параметра-массива.Синтаксис функции array_splice( ):

array_splice(array входной_массив, intсмещение, [int длина], [array заменяющий_массив]);

Значенияпараметров задаются по определеннымправилам:

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

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

Удалениевсех элементов с пятой позиции до концамассива:

$pasta = array_splice($pasta,5);

Удалениепятого и шестого элементов:

$pasta = array_splice($pasta.5, 2);

Заменапятого и шестого элементов новымизначениями:

$pasta = array_splice($pasta,5, 2, array("element1", "element2"));

Удалениевсех элементов, начиная с пятого, дотретьего элемента с конца массива:

$pasta = array_splice($pasta,5, -3);

Как видно изприведенных примеров, функция array_splice( )обеспечивает гибкие возможности удаленияэлементов из массива при минимальномобъеме кода.

shuffle( )

Функцияshuffle( ) сортирует элементы массива вслучайном порядке. Синтаксис функции shuffle( ):

void shuffle(array массив);

Итоги

В этой главерассматривались массивы и стандартныефункции РНР для работы с массивами. Вчастности, рассматривались следующие темы:

  • созданиеиндексируемых и ассоциативных массивов;
  • многомерныемассивы;
  • отображениесодержимого многомерных массивов;
  • поискэлементов;
  • добавлениеи удаление элементов;
  • размермассива;
  • сортировка;
  • другиеполезные функции для работы с массивами.

Массивыявляются очень удобными и универсальнымисредствами для работы с данными в web-приложениях.В примерах дальнейших глав массивы будутнеоднократно использоваться для повышенияэффективности и наглядности кода.

В главе 6 мыпродолжим знакомиться с базовымисредствами РНР. На этот раз речь пойдет обобъектно-ориентированных возможностяхязыка.