ГЛАВА 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 | | Spain | Spanish | | USA | English | | France | French | | Russia | Russian |
Этот примердает представление о самой сильной сторонеРНР - возможности объединениядинамического кода с 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 мыпродолжим знакомиться с базовымисредствами РНР. На этот раз речь пойдет обобъектно-ориентированных возможностяхязыка. |