В избранное    Домой   

Суббота,  20 Apr 2024 г., 06:15
Просящему у тебя дай и от хотящего занять у тебя не отвращайся. /Евангелие от Матфея/

 Логин:  

 Пароль: 




Анонсы:
=== Дата: 20/07/2011     Автор: Крис Ньюман ===

PHP. Урок 7 Работа с массивами

Урок 7. Работа с массивами

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

Что такое массив

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

Создание массива и доступ к нему

Предположим, нужно хранить среднюю температуру каждого месяца в году. Если использовать обычные однозначные переменные, также называемые скалярными, нужно 12 отдельных переменных - $temp_jan, $temp_feb и т. д. Массив позволяет использовать одно имя переменной для группирования значений, а индекс (или ключ) позволяет найти соответствующее значение для каждого месяца.

В следующем примере создается массив $temps с 12-ю значениями, которые соответствуют всем месяцам, с января по декабрь:

$temps = array(38, 40, 49, 60, 70, 79,
               84, 83, 76, 65, 54, 42);

Созданный массив $temps содержит 12 значений и проиндексирован от 0 до 11. Для того чтобы обратиться к значению массива, после имени нужно указать соответствующий индекс. Например, покажем температуру в марте:

echo $temps[2];

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

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

$temps[10] = 56;

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

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

$temps[ ] = 38;
$temps[ ] = 40;
$temps[ ] = 49;

Здесь элементу $temps[0] присваивается значение 38, элементу $temps[1] - 40 и так далее. Если нужно присвоить значение элементу $temps[0], желательно убедиться в том, что массив не инициализирован раньше. Для этого можно инициализировать массив пустым значением. В примере ниже показывается эта конструкция:

$temps = array[ ];

Вывод содержимого массива

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

$temps = array(38, 40, 49, 60, 70, 79,
             84, 83, 76, 65, 54, 42);
print "<PRE>";
print_r($temps);
print "</PRE>";

Результат функции print_r нужно выводить между дескрипторами <PRE>, т.к. он форматируется пробелами и переводами строки. На экране получим:

Array
(
    [0] => 38
    [1] => 40
    [2] => 49
    [3] => 60
    [4] => 70
    [5] => 79
    [6] => 84
    [7] => 83
    [8] => 76
    [9] => 65
    [10] => 54
    [11] => 42
)

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

Прохождение по массиву

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

С помощью цикла while можно найти все индексы и соответствующие им значения в массиве, как это делается в print_r:

while (list($key, $value) = each ($temps)) {
    echo "Ключ $key имеет значение $value <br>";
}

Все индексы массива сохраняются в переменной $key, а значение - в $value.

В PHP для прохождения по массиву есть более удобная конструкция foreach. Что предпочесть - while или foreach, - зависит от личных предпочтений и требований к читабельности кода.

Ниже эквивалентный пример для цикла foreach:

foreach ($temps as $key => $value) {
    …
}

Циклы. Можно заметить, что в примере с $temps для итерации по массиву можно воспользоваться циклом for, ведя отсчет по индексам о 0 до 11. Но, как будет показано дальше, такой прием не всегда сработает, потому что ключи массива не всегда составляют последовательность и даже могут быть строчными.

Ассоциативный массив

Выше приводился пример массива с числовыми ключами. Ассоциативный массив позволяет использовать для индексов более наглядные текстовые ключи.

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

$temps["jan"] = 38;
echo $temps["jan"];

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

$temps = array("jan" => 38, "feb" => 40, "mar" => 49,
            "apr" => 60, "may" => 70, "jun" => 79,
            "jul" => 84, "aug" => 83, "sep" => 76,
            "oct" => 65, "nov" =>54, "dec" => 42);

Элемент в ассоциативном массиве находится в том порядке, в котором его определили. Прохождение по ассоциативному массиву также происходит в том порядке, в котором определялись элементы.

Можно вызвать print_t для массива, чтобы убедиться в этом. Ниже несколько строк вывода:

Array
(
    [jan] => 38
    [feb] => 40
    [mar] => 49

Функции для работы с массивами

Выше уже рассматривалась функция array, которая используется для создания массива. Теперь рассмотрим другие функции PHP для работы с массивами.

Сортировка

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

sort($temps);

Функции сортировки. Функции sort передается массив, который она сортирует. Готовый массивнее возвращается, а возвращаемое значение свидетельствует об удачном или неудачном выполнении операции.

Сортировка массива $temps с помощью функции sort расставит все значения в порядке возрастания. Так, ненулевому элементу будет соответствовать наименьшее значение. Поэтому невозможно узнать, какое значение соответствует какому месяцу.

Для того чтобы сберечь ключевые значения, используется функция asort. Она меняет порядок при прохождении по массиву, но индексы останутся теми же. После сортировки $temps индекс 0 содержит среднюю температуру января, но при прохождении по массиву элементы извлекаются в порядке сортировки.

Выведем с помощью ассоциативного массива $temps название месяца и соответствующую среднюю температуру от самой холодной до самой теплой:

$temps = array("jan" => 38, "feb" => 40, "mar" => 49,
            "apr" => 60, "may" => 70, "jun" => 79,
            "jul" => 84, "aug" => 83, "sep" => 76,
            "oct" => 65, "nov" =>54, "dec" => 42);
assort($temps);
foreach ($temps as $month => $temp) {
    print "$month: $temp <br>\n";
}

Массивы сортируются не только по значениям, но и по ключам. Для этого используется функция ksort. Для ассоциативного массива функция ksort выстроит все элементы в алфавитном порядке по названиям месяца в ключах. Таким образом, после прохождения по отсортированному массиву первым получим элемент $temps["apr"], дальше - $temps["aug"] и так далее.

Чтобы изменить порядок сортировки этих функций, вместо sort используется функция rsort. Функция assort заменяется на arsort, а ksort - на krsort. Чтобы изменить порядок элементов в массиве без сортировки, используется array_reverse.

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

Кроме сортировки массива в определенном порядке, в PHP есть функции для быстрой перетасовки элементов в случайном порядке.

Функция shuffle работает так же, как и остальные функции сортировки. На вход подается один аргумент - массив, и производится перетасовка элементов в случайном порядке. Как и в sort, ассоциативные ключи теряются, и перемешанные значения индексируются числами.

Функции для работы с множествами

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

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

$union = array_merge($array1, $array2, $array3, …);

Функция возвращает массив, который состоит из всех элементов перечисленных массивов. В этом примере массив $union содержит все элементы массива $array1, за ними следуют элементы массива $array2 и так далее.

Чтобы изъять повторяющиеся из массива, нужно использовать функцию array_unique. Из двух ключей, указывающих на одинаковое значение, остается только один.

С помощью функции array_intersect находится пересечение двух массивов.

Следующий пример создает новый массив $intersect, содержащий элементы массива $array1, которые есть в массиве $array2:

$intersect = array_intersect($array1, $array2);

Функция array_diff позволяет найти разницу между двумя массивами. В примере ниже массив $diff состоит из элементов массива $array1, которых нет в массиве $array2:

$diff = array_diff($array1, $array2);

Внутри массива

Функция count возвращает количество элементов в массиве. На вход нужно подать один аргумент - массив. Например, в следующем выражении показывается, что в массиве $temps находится 12 значений:

echo count($temps);

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

if (in_array("PHP", $languages)) {
    …
}

Эти функции отличаются возвращаемыми значениями. Если значение находится внутри массива, функция array_search возвращает соответствующий ключ, а in_array только булево значение.

Нужное в искомом. Иногда можно запутаться из-за того, что аргументы искомое и где искать для функций in_array и array_search размещаются в обратном порядке к строковым функциям, таким как strops и strstr.

Чтобы проверить наличие отдельного ключа в массиве, используется функция array_key_exists. В следующем примере проводится поиск ключа "декабрь" ("dec") в массиве $temps:

if (array_key_exists("dec", $temps)) {
    …
}

Сериализация

Функция serialize создает текстовое представление информации, которая хранится в массиве. Этот мощный механизм позволяет легко сохранять содержимое массивов в PHP в базу данных или файл. Рассмотрим, как работает сериализация массивов.

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

Сериализованный массив $temps выглядит так:

a:12:{s:3:"jan",i:38;s:3:"feb",i:40;s:3:"mar";i:49;
a:3:"apr";i:60;s:3:"may";i:70;s:3:"jun";
i:79;s:3:"jul";i:84;s:3:"aug";i:83;s:3:"sep";
i:76;s:3:"oct";i:65;s:3:"nov";i:54;s:3:"dec";i:42;}

Не нужно разбираться в содержимом этой строки. Можно просто подать ее на вход функции unserialize, и она сама восстановит исходный массив.

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

Часто очень полезно использовать двух- и даже многомерные массивы. PHP позволяет создавать такие структуры.

Доступ к двухмерному массиву

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

echo $temps[1995] ["feb"];

Так как $temps массив массивов, $temps[1995] - это массив температур, проиндексированный по месяцам, и для обращения к его элементу нужно ввести имя в квадратных скобках.

Определение многомерного массива

Чтобы определить многомерный массив, достаточно помнить, что это массив, который содержит массивы.

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

$temps [1995] ["feb"] = 41;

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

$temps = array (
    1995 => array ("jan" => 36, "feb" => 42, "mar" => 51),
    1996 => array ("jan" => 37, "feb" => 42, "mar" => 49),
    1997 => array ("jan" => 34, "feb" => 40, "mar" => 50)
);

Функция print_r позволяет выводить все уровни, из которых состоит массив, в форматированном виде. Каждый отступ указывает на следующий уровень иерархии. Ниже приводится вывод трехмерного массива $temps:

Array
(      [1995] => Array
     (
         [jan] => 36
         [feb] => 42
         [mar] => 51
     )
     [1996] => Array
     (
         [jan] => 37
         [feb] => 42
         [mar] => 49
     )
     [1997] => Array
     (
         [jan] => 34
         [feb] => 40
         [mar] => 50
     )
)

Резюме

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


<<назад

Погода в Рудне
(Волгоградcкая обл.)

Подробнее >>


Курс валют
на 20 Апр 2024 г.
704 - Вьетнамских донгов
- 1