Массивы PHP — это своеобразные контейнеры-переменные для хранения сразу нескольких величин, к которым можно затем быстро и удобно обратиться. Конечно, никто не запрещает вам вообще их не использовать, а, например, давать своеобразные имена переменным, такие как $a1, $a2 и т. д., но представьте, что получится в этом случае, если вам нужно держать в памяти, скажем, тысячу таких переменных.
Пусть у нас в программе нужно описать список из нескольких фамилий. Можно сделать это так:
$NamesList[0]="Иванов";
$NamesList[1]="Петров";
$NamesList[2]="Сидоров";
. . .
Таким образом, мы по одному добавляем в массив $NamesList элементы, например, пронумерованные от 0. PHP узнает, что мы хотим создать массив, по квадратным скобкам (нужно заметить, что для этого переменная $NamesList в начале не должна еще быть инициализирована). Я буду в дальнейшем называть массивы, ключи (или, как их часто называют, индексы — то, что стоит в квадратных скобках) которых нумеруются с нуля и идут без пропусков (а это далеко не всегда так, как мы вскоре увидим), списками.
Некоторые стандартные функции PHP, обрабатывающие массивы, требуют передавать в их параметрах именно списки, хотя чаще всего можно это ограничение обойти, передав им любой другой массив. В таком случае они все равно рассматривают массив как обычный список, т. е. не обращают никакого внимания на его ключи. Во многих случаях это бывает нежелательно, на чем мы чуть позже остановимся подробнее. Давайте теперь посмотрим, как можно распечатать наш список. Самый простой способ — воспользоваться циклом for:
<?php
$NamesList[0]="Иванов";
$NamesList[1]="Петров";
$NamesList[2]="Сидоров";
echo "А вот первый элемент массива: ".$NamesList[0]."<hr>";
for($i=0; $i<4; $i++)
echo $NamesList[$i]."<br>";
for($i=0; $i<count($NamesList); $i++)
echo $NamesList[$i]."<br>";
?>
В окне веб-браузера это будет выглядеть ТАК.
Количество элементов в массиве легко можно определить, задействуя функцию count() или ее синоним sizeof():
for($i=0; $i<count($NamesList); $i++)
echo $NamesList[$i]."<br>";
что мы и сделали.
В приведенном примере, казалось бы, все гладко. За исключением одного небольшого недостатка: каждый раз, добавляя имя, мы должны были выбирать для него номер и заботиться, чтобы ненароком не указать уже существующий. Чтобы этого избежать, можно написать те же команды так:
<?php
$NamesList[]="Иванов";
$NamesList[]="Петров";
$NamesList[]="Сидоров";
echo "А вот первый элемент массива: ".$NamesList[0]."<hr>";
for($i=0; $i<count($NamesList); $i++)
echo $NamesList[$i]."<br>";
?>
В окне веб-браузера это будет выглядеть ТАК.
В этом случае PHP сам начнет (конечно, если переменная $NamesList еще не существует) нумерацию с нуля и каждый раз будет прибавлять к счетчику по единичке, создавая список. Согласитесь, довольно удобно. Разумеется, можно использовать [] и не только в таком простом контексте, очень часто они применяются для более общего действия — добавления элемента в конец массива.
Чтобы добавить новый элемент к существующему массиву, достаточно использовать следующие выражения:
Чтобы удалить элемент из массива или массив целиком, используется функция unset() с параметром, указывающем на элемент массива или сам массив соответственно.
Пример:
Добавим к нашему массиву новый элемент $NamesList[]="Федоров";
<?php
$NamesList[]="Иванов";
$NamesList[]="Петров";
$NamesList[]="Сидоров";
$NamesList[]="Федоров";
echo "А вот первый элемент массива: ".$NamesList[0]."<hr>";
for($i=0; $i<count($NamesList); $i++)
echo $NamesList[$i]."<br>";
?>
В окне веб-браузера это будет выглядеть ТАК.
А теперь, используя функцию unset(), удалим массив.
<?php
$NamesList[]="Иванов";
$NamesList[]="Петров";
$NamesList[]="Сидоров";
unset($NamesList); // удаление массива
echo "А вот первый элемент массива: ".$NamesList[0]."<hr>";
for($i=0; $i<count($NamesList); $i++)
echo $NamesList[$i]."<br>";
?>
В окне веб-браузера это будет выглядеть ТАК.
Если же нам нужно создать ассоциативный массив (по другому хэш), все делается совершенно аналогично, только вместо цифровых ключей мы должны указывать строковые. При этом следует помнить, что в строковых ключах буквы нижнего и верхнего регистров считаются различными. И еще: ключом может быть абсолютно любая строка, содержащая пробелы, символы перевода строки, нулевые символы и т. д. То есть, никаких ограничений на ключи не накладывается.
Поясню сказанное на примере. Пусть нам надо написать сценарий, который работает, как записная книжка: по фамилии абонента он выдает его имя. Мы можем организовать базу данных этой книжки в виде ассоциативного массива с ключами — фамилиями и соответствующими им значениями имен людей:
<?php
$Names["Иванов"]="Иван";
$Names["Петров"]="Сергей";
$Names["Сидоров"]="Дмитрий";
$Names["Федоров"]="Трофим";
echo $Names["Иванов"];
$f="Koteroff";
echo $Names[$f];
?>
В окне веб-браузера это будет выглядеть ТАК.
Массив также можно создать с помощью следующей конструкции:
$имя_массива = array([индекс1] = > значение1, [индекс2] = > значение2, . . . , [индексN] = > значениеN)
Здесь квадратные скобки указывают лишь на то, что заключенный в них элемент не является обязательным.
Пример.
<?php
$Names=array("Иванов","Иван", "37 лет");
print_r($Names) ;
echo '<br>';
$Names=array('Фамилия'=>"Иванов", 'Имя'=>"Иван", 'Возраст'=>"37");
print_r($Names);
echo '<br>';
$Names=array('Фамилия'=>"Иванов", 2=>"Иван", 3=>"37");
print_r($Names);
?>
Где, print_r($Names) — функция вывода сведений о переменных.
В окне веб-браузера это будет выглядеть ТАК.
Как видите, тут никаких особенностей нет, все работает совершенно аналогично спискам, только с нецифровыми ключами. Возможно, вы скажете, что это не совсем так: например, нельзя воспользоваться циклом for, как мы это делали раньше, для вывода всех персоналий, и окажетесь правы. Вскоре мы рассмотрим целых три приема, с помощью которых можно перебрать все элементы массива. Вы, скорее всего, будете применять их даже и для списков — настолько они удобны и универсальны, а к тому же и работают быстрее, чем последовательный перебор в цикле for с использованием $i.
Как мы уже знаем обращение к массивам происходит с помощью индексов. Однако в случае обращения к несуществующему элементу выводится сообщение об ошибке. В ряде случаев это не желательно. Чтобы подавить возможное сообщение, используется символ @, например:
@$anyelement = $Names[5];
Нам необходимо написать программу, которая по фамилии некоторого человека из группы будет выдавать его имя. Поступим так же, как и раньше: будем хранить данные в ассоциативном массиве:
$Names["Иванов"]="Иван";
$Names["Петров"]="Сергей";
$Names["Сидоров"]="Дмитрий";
Теперь сделаем следующую запись:
echo $Names["Иванов"];
echo $Names["Петров"];
echo $Names["Сидоров"];
echo $Names["Федоров"];
У нас получилась следующая конструкция:
<?php
$Names["Иванов"]="Иван";
$Names["Петров"]="Сергей";
$Names["Сидоров"]="Дмитрий";
echo $Names["Иванов"]; //выведет Иван
echo '<br>';
echo $Names["Петров"]; //выведет Сергей
echo '<br>';
echo $Names["Сидоров"];//выведет Дмитрий
echo '<br>';
echo $Names["Федоров"]; //ошибка: в массиве нет такого элемента!
?>
В окне веб-браузера это будет выглядеть ТАК.
Идем дальше. Прежде всего обратим внимание: приведенным выше механизмом мы никак не смогли бы создать пустой массив. Однако он очень часто может нам понадобиться, например, если мы не знаем, что раньше было в массиве $Names, но хотим его проинициализировать указанным путем. Кроме того, каждый раз задавать массив указанным выше образом не очень-то удобно — приходится все время однообразно
повторять строку $Names...
Поэтому второй способ создания массива — это использование оператора array(). Его мы уже рассматривали.
Массивы рассмотренные выше, являются одномерными. Однако элементы массива могут содержать данные различных типов, т.ч. и массивы. Если в качестве элементов некоторонго массива создать массивы, то получится двумерный массив. Обращение к элементам такого массива происходит в соответствии со следующим синтаксисом:
имя_массива[индекс_уровня1] [индекс_уровня2]
Например, если кроме имени о человеке известен также его возраст, то можно инициировать массив $Names так:
$Names["Иванов"]=array('Имя'=>"Иван", 'Возраст'=>"37");
$Names["Петров"]=array('Имя'=>"Сергей", 'Возраст'=>"28");
$Names["Сидоров"]=array('Имя'=>"Дмитрий", 'Возраст'=>"30")
или даже так:
$Names=array(
"Иванов"=>array('Имя'=>"Иван", 'Возраст'=>"37"),
"Петров"=>array('Имя'=>"Сергей", 'Возраст'=>"28"),
"Сидоров"=>array('Имя'=>"Дмитрий", 'Возраст'=>"30")
);
Пример:
<?php
$Names=array(
"Иванов"=>array('Имя'=>"Иван", 'Возраст'=>"37"),
"Петров"=>array('Имя'=>"Сергей", 'Возраст'=>"28"),
"Сидоров"=>array('Имя'=>"Дмитрий", 'Возраст'=>"30")
);
echo $Names["Иванов"]["Имя"];
echo '<br>';
echo $Names["Петров"]["Имя"];
echo '<br>';
echo $Names["Сидоров"]["Возраст"];
?>
В окне веб-браузера это будет выглядеть ТАК.
а можно и так:
$Names=array(
array("Иванов", "Иван", 37),
array("Петров", "Сергей", 28),
array("Сидоров", "Дмитрий", 30),
);
Пример:
<?php
$Names=array(
array("Иванов", "Иван", 37),
array("Петров", "Сергей", 28),
array("Сидоров", "Дмитрий", 30),
);
echo $Names[0][1];
echo '<br>';
echo $Names[1][0];
echo '<br>';
echo $Names[2][2];
?>
В окне веб-браузера это будет выглядеть ТАК.
Для просмотра структуры и значений элементов массива(это может понадобиться при отладке программ) используются функции print_r() и var_dump().
Для вывода значений элементов массива можно воспользоваться операторами цикла for и while.
<?php
$Names=array("Сидоров", "Дмитрий", 30);
$i=0;
while($i<count($Names)){
echo $Names[$i], '<br>';
$i++;
}
?>
В окне веб-браузера это будет выглядеть ТАК.
Вывод элемента массива с помощью оператора echo производится так же, как и обычной переменной.
echo $Names[$i];
Однако если требуется вывести элемент массива в составе текстовой строки, то его следует заключить в фигурные скобки.
Пример:
<?php
$Names=array("Сидоров", "Дмитрий", 30);
echo "Cотрудник {$Names[0]}, его возраст {$Names[2]} лет";
?>
В окне веб-браузера это будет выглядеть ТАК.