Ранее мы рассмотрели, как в переменные можно сохранить одиночное значение, например, одно число или одну строку. Но кроме того, мы можем сохранить в переменную набор значений. И для этого используются массивы.
Есть несколько способов определения массивов. Первый способ представляет использование функции array():
$numbers = array();
В данном случае определяется пустой массив $numbers
.
Второй способ представляет использование квадратных скобок []:
$numbers = [];
При определении массива мы сразу можем передать ему начальные данные. Если применяются квадратные скобки, то элементы массива передаются внутри скобок:
$numbers = [1, 2, 3, 4];
Аналогичное определение массива с помощью функции array()
:
$numbers = array(1, 2, 3, 4);
В качестве элементов массива могут выступать объекты любого типа.
Для обращения к элементам массива применяются ключи. Ключ может представлять число или строку или одновременно и числа, и строки.
Для обычных массивов ключ представляет число. Числовые ключи еще называют индексами. Нумерация индексов начинается с нуля, то есть первый элемент массива имеет индекс 0, второй элемент - индекс 1 и так далее.
Например, обратимся к третьему элементу массива:
<?php $numbers = [1, 4, 9, 16]; echo $numbers[2]; // 9 ?>
Поскольку нумерация индексов начинается с нуля, то чтобы обратиться к третьему элементу, надо использовать индекс 2.
Таким образом мы получаем значение элемента массива. Но также мы можем его изменить:
<?php $numbers = [1, 4, 9, 16]; $numbers[1] = 6; echo $numbers[1]; // 6 ?>
При этом нужно учитывать количество элементов массива. Так, мы не можем обратиться к элементу с несуществующим индексом:
<?php $numbers = [1, 4, 9, 16]; echo $numbers[4]; ?>
В данном случае в массиве $numbers всего 4 элемента, поэтому индексом последнего элемента будет 3. Таким образом, элемента с индексом 4 в массиве не существует, и
при попытке получить его значение echo $numbers[4]
PHP нам покажет предупреждение.
Тем не менее если мы хотим установить элемент по еще не существующему индексу, мы можем это сделать:
<?php $numbers = [1, 4, 9, 16]; $numbers[5] = 76; echo $numbers[5]; // 76 ?>
Здесь устанавливается элемент с индексом 5. После установки мы можем получать его значение. При этом элемента с индексом 4 по прежнему не существует.
Для добавления нового элемента в массив мы можем, как в примере выше, просто установить новый элемент по еще не установленному индексу. Но есть и другой способ:
<?php $numbers = [1, 4, 9, 16]; $numbers[] = 25; echo $numbers[4]; // 25 ?>
При таком способе новый элемент добавляется в конец массив, соответственно здесь, чтобы получить новый элемент, надо использовать индекс 4.
Чтобы получить полное наглядное представление о том, как в конкретном массиве сопоставляются ключи и значения элементов, можно использовать
функцию print_r
, в которую в качестве параметра передается массив:
<?php $numbers = [1, 4, 9, 16]; $numbers[] = 25; print_r($numbers); ?>
Вывод скрипта:
Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
Также следует отметить, что необязательно как-то специально инициализровать переменную массива - мы можем по ходу добавлять элементы в массив:
<?php $numbers[] = 20; $numbers[] = 120; $numbers[] = 720; print_r($numbers); // Array ( [0] => 20 [1] => 120 [2] => 720 ) ?>
Оператор => позволяет сопоставить ключ с определенным значением. Хотя при определении массива выше нам не требовался подобный оператор, тем не менее мы можем его применять. Например, следующий массив:
$numbers = [1, 4, 9, 16];
Будет аналогичен следующему массиву:
$numbers = [0=>1, 1=>4, 2=>9, 3=>16]; // $numbers = array(0=>1, 1=>4, 2=>9, 3=>16);
Каждый элемент определяется в следующем формате: ключ => значение
В дальнейшем мы также можем обращаться к элементам этого массива.
Этот оператор может понадобится, если мы хотим переопределить порядок индексов. Так, по умолчанию нумеация индексов начинается с нуля и каждый следующий элемент имеет индекс предыдущего элемента + 1. Оператор => же позволяет определить свои индексы вручную для элементов, необязательно с нуля и необязательно по порядку:
$numbers = [1=> 1, 2=> 4, 5=> 25, 4=> 16]; echo $numbers[2]; // 4
Также мы можем задать индекс лишь для одного элемента, тогда для последующих элементов индекс автоматически будет увеличиваться на единиицу:
$numbers = [4=> 16, 25, 36, 49, 64]; print_r($numbers);
В данном случае индексация начинается с числа 4 - это индекс элемента 16. Тогда для элемента 25 индексом будет число 5 и так далее.
Результат:
Array ( [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 )
Для перебора массива мы можем применять стандартный метод for:
<?php $users = ["Tom", "Sam", "Bob", "Alice"]; $num = count($users); for($i=0; $i < $num; $i++) { echo "$users[$i] <br />"; } ?>
В данном случае мы не определяем вручную индексы элементов, поэтому индексация начинается с нуля с увеличением на единиицу для последующего элемента.
Поэтому мы можем в цикле через переменную $i
передавать индекс, начиная с нуля. Единственная трудность может заключаться в том,
как определить индекс конечного элемента, чтобы установить потолок для переменной $i
. В этом случае мы можем с помощью встроенной
функции count() получить длину массива. Эта функция в качестве параметра принимает массив и возвращает его длину.
Результат работы скрипта:
Tom Sam Bob Alice
Тем не менее выше использованный способ перебора не поможет, если индексы определяются вручную и отличаются они от соседних индексов не на единицу, а на произвольную величину. В этом случае мы можем использовать специальный цикл - foreach:
<?php $users = [1 => "Tom", 4 => "Sam", 5 => "Bob", 21 => "Alice"]; foreach($users as $element) { echo "$element<br />"; } ?>
В цикле foreach из массива последовательно извлекаются все элементы, и их значение помещается в переменную,
указанную после ключевого слова as. В данном случае в переменную $element
по очереди помещаются
все четыре значения из массива $users
. Когда будет извлечен последний элемент из массива, цикл завершается.
В итоге мы получим тот же результат:
Tom Sam Bob Alice
Цикл foreach позволяет извлекать не только значения, но и ключи элементов:
<?php $users = [1 => "Tom", 4 => "Sam", 5 => "Bob", 21 => "Alice"]; foreach($users as $key => $value) { echo "$key - $value<br />"; } ?>
Здесь при переборе элементов цикла в переменную $key
будет передаваться ключ элемента, а в переменную $value
-
его значение.
Результат работы скрипта:
1 - Tom 4 - Sam 5 - Bob 21 - Alice