- Многомерные массивы, поиск

Печать: Шрифт: Абв Абв Абв
admin 27 Февраля 2006 в 15:49:23
Многомерные массивы

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

<?
$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
["Fruit Cup"]["preparation"] // возвращает "10 minutes"
$desserts["Brownies"]["calories"] // возвращает "high"
?>


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

<?
$desserts
["Cake"]["calories"] = "too many";
// Присваивает свойству "calories" объекта "Cake" значение "too many"
?>


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

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

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

<?
print "Brownies are good, but the calories content is ".
$desserts["Brownies"]["calories"];
?>


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

<?
print "Brownies are good, but the calories content is
{$desserts[Brownies][calories]}";
?>


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

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

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

in_array()

Функция i n_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 now subscribed 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" => "Feiler Artinger 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" => "Feiler Artinger 97");
$great_labels = array_values('$great_wines);
// $great_labels = аrrау("Clarendon Hills 96",
// "Comte George de Vogue 97",
// "Feiler Artinger 97");
?>


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

Комментарии, по рейтингу, по дате
  Гость 12.06.2008 в 10:08:58   # 3485
материал отстой
  Ядерщик 12.06.2008 в 10:12:53   # 3486
Для новичка в самый раз
  Гость 26.06.2008 в 16:16:31   # 3852
  dave 31.05.2009 в 17:48:30   # 15792
у мня есть статья, писал см как связать SAB и базы mysql средствами php может для тебя ето будет не отстой!
Добавить сообщение
Чтобы добавлять комментарии зарeгиcтрирyйтeсь