Разработчику. Сборник рецептов PHP
Задавайте вопросы

Массивы

Вернуться назад

Введение

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

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

В других языках существует и другой тип массива: ассоциативный массив, известный также как хеш. В ассоциативном массиве в качестве индексов выступают не целые числа, а строки. Так, в массиве президентов США «Авраам Линкольн» мог бы иметь индекс 16, а в ассоциативной версии массива индекс мог бы быть «Honest». Однако в то время как в массиве с числовой индексацией порядок элементов продиктован его ключами и строго соблюдается, ассоциативный массив часто не гарантирует упорядочение ключей. Элементы добавляются в определенном порядке, но позже этот порядок никоим образом определить нельзя.

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

В PHP массив с числовой индексацией является ассоциативным массивом, и наоборот. Какой же тогда тип они имеют в действительности? Оба и никакой. Граница между ними постоянно смещается от одного к другому. Поначалу это может дезориентировать, особенно тех, кто придерживается строгих правил, но скоро и они обнаружат, что такая гибкость – ценное свойство.

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

$fruits = array('Apples', 'Bananas', 'Cantaloupes', 'Dates');

Теперь значение $fruits[2] равно 'Cantaloupes'. Функция array() очень удобна в случае короткого списка известных значений. Тот же самый массив можно получить так:

$fruits[0] = 'Apples';
$fruits[1] = 'Bananas';
$fruits[2] = 'Cantaloupes';
$fruits[3] = 'Dates';

и так:

$fruits[ ] = 'Apples';
$fruits[ ] = 'Bananas';
$fruits[ ] = 'Cantaloupes';
$fruits[ ] = 'Dates';

Присваивание значения элементу массива с пустым списком индексов – это сокращенная запись операции добавления нового элемента в конец массива. Так, PHP определяет длину массива $fruits и использует ее в качестве позиции нового значения. Это предполагает, конечно, что переменная $fruits не является скалярной, например 3, и не является объектом. PHP не выразит недовольства, если вы попробуете трактовать немассив как массив; однако если это будет первым случаем использования этой переменной, то PHP автоматически преобразует ее в массив и начнет отсчет индекса с 0.

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

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

while ($row = mysql_fetch_row($r)) {
        $fruits[ ] = $row;
}
while ($obj = mysql_fetch_object($s)) {
        $vegetables[ ] = $obj;
}

Первый оператор while создает массив массивов; второй создает массив объектов. Смотрите рецепт опубликованный ниже, где хранение множества элементов по одному ключу описано более подробно.

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

$fruits = array('red' => 'Apples', 'yellow' => 'Bananas',
'beige' => 'Cantaloupes', 'brown' => 'Dates');

Теперь значение переменной $fruits['beige'] равно 'Cantaloupes'. Это краткая запись следующего фрагмента:

$fruits['red'] = 'Apples';
$fruits['yellow'] = 'Bananas';
$fruits['beige'] = 'Cantaloupes';
$fruits['brown'] = 'Dates';

Каждый массив может хранить только одно уникальное значение для каждого ключа. Присваивание:

$fruits['red'] = 'Strawberry';

перепишет значение 'Apple'. Однако всегда можно добавить другой ключ позже:

$fruits['orange'] = 'Orange';

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

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

$fruits = array('red' => 'Apples', 'yellow' => 'Bananas',
'beige' => 'Cantaloupes', 'brown' => 'Dates');

foreach ($fruits as $color => $fruit) {
      print "$fruit are $color.\n";
}

Apples are red.
Bananas are yellow.
Cantaloupes are beige.
Dates are brown.

При каждом прохождении цикла PHP присваивает значение следующего ключа переменной fruit. Когда в массиве не остается ни одного элемента, цикл заканчивается.

Функция list() позволяет разбивать массив на отдельные переменные:

$fruits = array('Apples', 'Bananas', 'Cantaloupes', 'Dates');

        list($red, $yellow, $beige, $brown) = $fruits;

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ