ProfiPHPProfiPHP
  1. Главная
  2. Самоучитель PHP 7
  3. Массивы

Массивы

Наиболее часто встречающиеся структуры для хранения данных являются массивы, которые представляет собой индексированную совокупность переменных одного типа. Каждая переменная или элемент массива имеет свой индекс и пронумерованы от 0 до N - 1, где N - размер массива. Имена массивов, так же как и переменных, начинаются с символа $. Для обращения к отдельным элементам массива, необходимо разместить после его имени квадратные скобки [], в которых указать индекс элемента массива. Если в качестве элементов массива выступают другие массивы, то такие массивы называются многомерные, а для обращения к конечным элементам используют несколько пар квадратных скобок, где указываются индексы соответственно двоих массивов.

Создание массива


Для создания массивов существует несколько способов. Самым простым является использование конструкции Array, в круглых скобках которой через запятую перечисляются элементы массива. Конструкция array() в качестве результата возвращает массив.
<?php
$arr = array('red', 'green', 'yellow');
echo $arr[0]; // red
echo $arr[1]; // green
echo $arr[2]; // yellow
echo $arr; // Notice: Array to string conversion (array)
В данном примере создается массив $arr, состоящий из трех элементов, пронумерованных от 0 до 2. Каждый элемент массива выводится при помощи отдельной конструкции Echo. При попытке вывода всего массива $arr в окно браузера вместо его содержимого будет выведена строка "Array" c предупреждением типа Notice. Для просмотра структуры и содержимого массива предусмотрена специальная функция Print_r.

Создать массив можно при помощи пары квадратных скобок. Следующий пример эквивалентен предыдущему:
<?php
$arr = ['red', 'green', 'yellow'];
Данный подход повторяет синтаксис массивов в других современных скриптовых языках, таких как Python или Ruby. Однако, поскольку исторически конструкция array() появилась в PHP первой, очень часто в коде готовых РНР-приложений можно встретить именно ее.

Как видно из предыдущих примеров, элементам массива автоматически назначены индексы, начиная с нулевого. Однако индекс начального элемента, а также порядок следования индексов можно изменять. Для этого в конструкции array() или в [] перед элементом указывается его индекс при помощи оператора =>:
<?php
$arr = [5 => 'red', 'green', 'yellow'];
В результате первому элементу массива $arr назначается индекс 5, последующие элементы автоматически получают номера 6 и 7. Также следует отметить, что элементы с индексами 0, 1, ... 4 и 8, ... просто не существуют, обращение к ним воспринимается как обращение к неинициализированной переменной со значением Null.

Назначать индексы можно не только первому элементу, но и всем последующим элементам массива. Все непронумерованные элементы будут автоматически получать значение, равное максимальному и увеличенному на единицу.

Еще одним способом создания массива является присвоение неинициализированным элементам массива новых значений. Следующий пример полностью эквивалентен предыдущему:
<?php
$arr[5] = 'red';
$arr[] = 'green';
$arr[] = 'yellow';
Если значение индекса не указывается в квадратных скобках, тогда назначение индексов к элементам происходит автоматически.

Еще один способ создания массива заключается в приведении скалярной переменной (то есть переменной типа Integer, Float, String или Boolean) к типу Array. В результате будет создан массив, содержащий один элемент с индексом 0 и значением, равным значению переменной.
<?php
$var = 'color red';
$arr = (array)$var;

Индексные и ассоциативные и массивы


Если в качестве индексов массива выступают числа, он называется индексным. Но если в качестве индексов массивов выступают не числа, а строки, то такой массив называют ассоциативным, а его индексы – ключами. Один массив может иметь как числовые индексы, так и строковые ключи, и называется соответственно смешанным.
<?php
$arr = ['one' => 'red', 'two' => 'green'];
Результат выполнения примера будет массив:
Array
(
[one] => red
[two] => green
)
При обращении к элементам ассоциативного массива вместо индексов указываются соответствующие ключи, которые, как и обычные строки, зависят от регистра.

Также, кроме конструкций array() и [], допускается создание элементов ассоциативного массива посредством прямого обращения к ним:
<?php
$arr['one'] = 'red';
$arr['two'] = 'green';
При попытке создания двух элементов массива с одинаковыми ключами, создается один элемент с последним значением.

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


Если в качестве элементов массива выступают другие массивы, тогда массив называется многомерным. Принцип создания многомерных массивов аналогичен созданию одномерных. Массивы можно создавать, обращаясь к элементам или используя вложенные конструкции array() или [].
<?php
$arr = [
'color' => ['red', 'green', 'yellow']
];
В результате такой инициализации будет создан массив следующей структуры:
Array
(
[color] => Array
(
[0] => red
[1] => green
[2] => yellow
)

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

Интерполяция элементов массива в строки


В строках с двойными кавычками вместо переменных подставляется их значение. Точно так же ведут себя элементы массива:
<?php
$arr[] = 'red';
echo "Color $arr[0]";
Если речь идет об ассоциативных массивах, то кавычки, которыми обрамляется ключ, указывать не следует, в противном случае скрипт вернет ошибку разбора:
Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) 
Однако в случае многомерных массивов интерполировать элемент так, как это продемонстрировано в предыдущем примере, уже не получится. Для интерполяции потребуется либо заключить элемент в фигурные кавычки {}, либо использовать конкатенацию строк .:
<?php
$arr[] = 'red';
echo "Color {$arr['0']}";
echo "Color ".$arr[0];
Как видно из примера, при использовании фигурных скобок для ключей элементов ассоциативных массивов можно указывать кавычки.

Конструкция List


С помощью конструкции List можно осуществить обратную задачу конструкций array() и [] - преобразовать элементы массива в обычные переменные:
<?php
$arr = [1, 2, 3];
list($one, $two, $three) = $arr;
echo $one; // 1
echo $two; // 2
echo $three; // 3
Конструкция list() работает исключительно с числовыми массивами, нумерация индексов которых начинается с нуля. При попытке преобразования элементов ассоциативного массива будет выведено предупреждения типа: Notice: Undefined offset.

В круглых скобках конструкции list() количество элементов может не совпадать с количеством элементов разбираемого массива. При этом, если элементов в массиве больше - лишние будут отброшены, если меньше - часть переменных останется неинициализированными. Кроме того, часть первых элементов массива может быть пропущена, для этого достаточно указать соответствующее количество запятых:
<?php
$arr = [1, 2, 3];
list(,,$three) = $arr;
echo $one; // Notice: Undefined variable
echo $two; // Notice: Undefined variable
echo $three; // 3
Конструкции list() может использоваться для обмена значений переменных без переменной-посредника:
list($y, $x) = [$x, $y];

Обход массива


Обход массива в цикле является очень частой задачей. Для индексных массивов для их обхода можно воспользоваться операторами For или While, для ассоциативных массивов предназначен специализированный оператор Foreach. Продемонстрируем обход индексного массива при помощи цикла For:
<?php
$numbers = ['1', '2', '3'];
for ($i = 0; $i < count($numbers); $i++) {
echo $numbers[$i];
}
Результатом работы примера будет строка: 123. С помощью функции Count выполнили подсчет количества элементов в массиве, которая принимает в качестве параметра массив и возвращает количество элементов в нем.

Цикл Foreach специально создан для ассоциативных массивов и имеет следующий синтаксис:
foreach ($array as [$key =>] $value) {
операторы;
}
Цикл Foreach последовательно обходит все элементы массива $array, помещая на каждой итерации цикла ключ в переменную $key, а значение в переменную $value. Имена этих переменных могут быть любыми.
<?php
$arr = [
'first' => '1',
'second' => '2',
'third' => '3'
];
foreach ($arr as $index => $val) {
echo $index . ' = '. $val;
}
Результатом работы примера будут следующие строки:
first = 1
second = 2
third = 3
Переменную $index можно опустить, поскольку она не обязательна.

Число вложенных циклов соответствует размерности массива:
<?php
$arr = [
'Color' => ['red', 'yellow', 'green'],
];
foreach ($arr as $name => $color) {
echo '<p>'.$name.'</p>';
foreach ($color as $value) {
echo '<p> -'.$value.'</p>';
}
}
Результат выполнения скрипта:
Color
-red
-yellow
-green

Слияние массивов


Для складывания значения двух массивов можно использовать оператор "плюс" (+).
<?php
$fst = [1 => 'one'];
$snd = [2 => 'two'];
$sum = $fst + $snd;
В результате выполнения примера будет выведен следующий массив $sum:
Array
(
[1] => one
[2] => two
)
При добавлении массивов с одинаковыми индексами, в результирующий массив попадают элементы из первого массива:
<?php
$fst = [1, 2];
$snd = [3, 4, 5];
$sum = $fst + $snd;
В результате выполнения примера будет выведен следующий массив $sum:
Array
(
[0] => 1
[1] => 2
[2] => 5
)
Если необходимо, чтобы в результирующий массив попали элементы обоих массивов, вместо оператора + используют специальную функцию Array_merge, которая в качестве параметров принимает сливаемые массивы.
<?php
$fst = [1, 2];
$snd = [3, 4, 5];
$sum = array_merge($fst, $snd);
В результате выполнения примера будет выведен следующий массив $sum:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)

Сравнение массивов


Сравнивать массивы можно при помощи операторов равенства == и неравенства !=. Два массива считаются равными, если количество и значения их ключей и значений совпадают:
<?php
$ar1 = [1, 2];
$ar2 = [1, 2];
$ar3 = [1, 2, 3];
if ($ar1 == $ar2) {
echo 'Массивы равны';
} else {
echo 'Массивы не равны';
}
if ($ar1 == $ar3) {
echo 'Массивы равны';
} else {
echo 'Массивы не равны';
}
При первом условии будет выведен результат Массивы равны, при втором - Массивы не равны.

Операторы эквивалентности === и неэквивалентности !== соответственно схожи с операторами равенства == и неравенства !=. Два массива считаются эквивалентными, если совпадают не только количество их элементов, ключи и значения, но имеется и совпадение типов значений.

Проверка существования элементов массива


Проверить, существует тот или иной элемент массива, можно при помощи конструкции Isset:
<?php
$arr = [1, 2];
for ($i = 0; $i < 3; $i++) {
echo isset($arr[$i]) ? "Элемент \$arr[$i] существует" : "Элемент \$arr[$i] не существует";
}
В качестве результата примера будут следующие строки:
Элемент $arr[0] существует
Элемент $arr[1] существует
Элемент $arr[2] не существует
Существование массива также может быть проверено при помощи конструкции Isset. Если необходимо убедиться, является ли текущая переменная массивом, используют функцию Is_array.

Для поиска значений в массиве используется функция In_array, которая осуществляет поиск значения в массиве и возвращает True, если значение найдено, и False - в противном случае.
<?php
$arr = [1, 2];
if (in_array(2, $arr) ) {
echo "Элемент существует";
}
Аналогично функции In_array для поиска заданного ключа в массиве можно воспользоваться функцией Array_key_exists, которая возвращает True, если ключ найден в массиве.

Найти ключ массива по значению позволяет функция Array_search, которая ищет значение в массиве и, если значение найдено, возвращает соответствующий ключ, в противном случае возвращается False.

Добавить комментарий

Имя:
Текст комментария: