Главное меню

Использование массивов

Этот раздел посвящен использованию одной из наиболее важных программных конструкций – массивов. Переменные, которые рассматривались в ранее, были скалярными, и в них хранилось единственное значение. Массив (array) представляет собой переменную, в которой хранится набор, или последовательность, значений. Один массив может содержать множество элементов. Каждый элемент массива может содержать только одно значение, причем таким значением может быть текст, число или другой массив. Массив, который содержит другие массивы, называется многомерным массивом.

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

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

В этом разделе изучим следующие темы:

• Массивы с числовыми индексами.

• Массивы с индексацией, отличной от числовой.

• Операции для работы с массивами.

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

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

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

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

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

Список товаров, поставляемых компанией “Автозапчасти от Вована”, в нашем примере представлен массивом. На рис. 3.1 показан список трех из этих товаров, хранящихся в переменной $products. (Вскоре будет показано, как создавать такие переменные.)

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

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

Хранимые в массиве значения носят название элементов массива. Каждый элемент массива имеет связанный с ним индекс (называемый также ключом), который используется для доступа к этому элементу.

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

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

Рассмотрение начнем с численно-индексированных массивов, после чего перейдем к использованию ключей, определенных пользователем.

Численно-индексированные массивы

Численно-индексированные массивы поддерживаются в большинстве языков программирования. По умолчанию в РНР эти индексы начинаются с нуля, хотя это можно изменить.

Инициализация численно-индексированных массивов

Для создания массива, показанного на рис. 3.1, воспользуемся следующей строкой кода:

$products = array('Покрышки', 'Масло', 'Свечи зажигания');

В результате создается массив $products, содержащий три заданных значения: 'Покрышки', 'Масло' и 'Свечи зажигания'. Обратите внимание, что подобно echo, array () в действительности является языковой конструкцией, а не функцией.

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

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

$numbers = range(1, 10);

Функция range () может также принимать необязательный третий параметр, который позволяет установить шаг между значениями. Например, если необходимо получить массив нечетных чисел от 1 до 10, следует воспользоваться таким кодом:

$odds = range(1, 10, 2);

Функцию range () можно применять и для символов:

$letters = range('a', 'z');

Если информация хранится в дисковом файле, содержимое массива можно загрузить непосредственно из этого файла. Этот процесс будет рассматриваться в разделе “Загрузка массивов из файлов” далее.

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

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

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

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

Например, чтобы использовать содержимое массива $products, необходимо ввести: $products[0], $products[1] и $products[2].

По умолчанию первым элементом массива является элемент с нулевым индексом. Эта же схема нумерации используется в С, C++, Java и ряде других языков программирования, но если вы с ней не работали, то чтобы привыкнуть к ней, потребуется некоторое время.

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

$products[0] = 'Предохранители';

Следующая строка добавляет в конец массива новый элемент "Предохранители", после чего массив содержит уже четыре элемента:

$products[3] = 'Предохранители';

Для отображения содержимого массива можно ввести такой оператор:

echo "$products[0] $products[l] $products[2] $products[3]

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

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

Следующий код создает этот же массив $products, но без помощи array():

$products[0] = 'Покрышки';

$products[l] = 'Масло';

$products[2] = 'Свечи зажигания';

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

Использование циклов для доступа к массиву

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

for ($i = 0; $i < 3; $i++) {

echo $products[$i] . " ";

}

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

Можно также воспользоваться циклом fоreach, специально предназначенным для работы с массивами. Для данного примера упомянутый цикл применяется следующим образом:

foreach ($products as $current) {

echo $current . " ";

}

Этот код поочередно сохраняет каждый элемент массива в переменной $current и затем выводит ее.

Массивы с различными индексами

При создании массива $products мы предоставили РНР возможность присвоить каждому элементу индекс по умолчанию. Это означает, что первый добавленный элемент стал 0-м элементом, второй — 1-м и т.д. РНР поддерживает также массивы, в которых с каждым значением можно связать (ассоциировать) любой ключ (индекс).

Инициализация массива

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

$prices = array('Покрышки'=>100, 'Масло'=>10, 'Свечи зажигания'=>4);

Символ, находящийся между ключом и значением, состоит из знака равенства, за которым следует знак “больше”.

Доступ к элементам массива

Как и ранее, доступ к содержимому массива осуществляется через имя переменной и ключ, поэтому к информации, сохраненной в массиве $prices, можно обратиться как к $prices['Покрышки'], $prices['Масло'] и $prices['Свечи зажигания'].

Следующий код создает этот же массив $prices. Но вместо того, чтобы сразу создавать массив с тремя элементами, сначала создается массив с только, одним элементом, а затем в массив добавляются еще два элемента.

$prices = array('Покрышки'=>100);

$prices['Масло'] = 10;

$prices['Свечи зажигания'] = 4;

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

$prices['Покрышки'] = 100;

$prices['Масло'] = 10;

$prices['Свечи зажигания'] = 4;