ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Массивы PHP. Автомассивы PHP. Многомерные массивы PHP. Отображение массивов PHP

Массивы

Массивы PHP — это своеобразные контейнеры-переменные для хранения сразу нескольких величин, к которым можно затем быстро и удобно обратиться. Конечно, никто не запрещает вам вообще их не использовать, а, например, давать своеобразные имена переменным, такие как $a1, $a2 и т. д., но представьте, что получится в этом случае, если вам нужно держать в памяти, скажем, тысячу таких переменных.

Пусть у нас в программе нужно описать список из нескольких фамилий. Можно сделать это так:

$NamesList[0]="Иванов";
$NamesList[1]="Петров";
$NamesList[2]="Сидоров";
. . .

Таким образом, мы по одному добавляем в массив $NamesList элементы, например, пронумерованные от 0. PHP узнает, что мы хотим создать массив, по квадратным скобкам (нужно заметить, что для этого переменная $NamesList в начале не должна еще быть инициализирована). Я буду в дальнейшем называть массивы, ключи (или, как их часто называют, индексы — то, что стоит в квадратных скобках) которых нумеруются с нуля и идут без пропусков (а это далеко не всегда так, как мы вскоре увидим), списками.

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

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Массивы</title>
</head>

<body>
<?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>";
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

Количество элементов в массиве легко можно определить, задействуя функцию count() или ее синоним sizeof():

for($i=0; $i echo $NamesList[$i]."
";

что мы и сделали.

Создание массива "на лету". Автомассивы PHP

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

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Массивы</title>
</head>

<body>
<?php
$NamesList[]="Иванов";
$NamesList[]="Петров";
$NamesList[]="Сидоров";
echo "А вот первый элемент массива: ".$NamesList[0]."<hr>";
for($i=0; $i<count($NamesList); $i++)
echo $NamesList[$i]."<br>";
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

В этом случае PHP сам начнет (конечно, если переменная $NamesList еще не существует) нумерацию с нуля и каждый раз будет прибавлять к счетчику по единичке, создавая список. Согласитесь, довольно удобно. Разумеется, можно использовать [] и не только в таком простом контексте, очень часто они применяются для более общего действия — добавления элемента в конец массива.

Чтобы добавить новый элемент к существующему массиву, достаточно использовать следующие выражения:

  • $имя_массива[] = значение — добавляется новый элемент с числовым индексом;
  • $имя_массива[индекс] = значение — если в массиве нет элемента с указанным индексом, то элемент добавляется, в противном случае — изменяется (перезаписывается)

Чтобы удалить элемент из массива или массив целиком, используется функция unset() с параметром, указывающем на элемент массива или сам массив соответственно.

Пример:

Добавим к нашему массиву новый элемент $NamesList[]="Федоров";

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Массивы</title>
</head>

<body>
<?php
$NamesList[]="Иванов";
$NamesList[]="Петров";
$NamesList[]="Сидоров";
$NamesList[]="Федоров";
echo "А вот первый элемент массива: ".$NamesList[0]."<hr>";
for($i=0; $i<count($NamesList); $i++)
echo $NamesList[$i]."<br>";
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

А теперь, используя функцию unset(), удалим массив.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Массивы</title>
</head>

<body>
<?php
$NamesList[]="Иванов";
$NamesList[]="Петров";
$NamesList[]="Сидоров";
unset($NamesList); // удаление массива
echo "А вот первый элемент массива: ".$NamesList[0]."<hr>";
for($i=0; $i<count($NamesList); $i++)
echo $NamesList[$i]."<br>";
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

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

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

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Массивы</title>
</head>

<body>
<?php
$Names["Иванов"]="Иван";
$Names["Петров"]="Сергей";
$Names["Сидоров"]="Дмитрий";
$Names["Федоров"]="Трофим";
echo $Names["Иванов"];
$f="Koteroff";
echo $Names[$f];
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

Массив также можно создать с помощью следующей конструкции:

$имя_массива = array([индекс1] = > значение1, [индекс2] = > значение2, . . . , [индексN] = > значениеN)

Здесь квадратные скобки указывают лишь на то, что заключенный в них элемент не является обязательным.

Пример.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Массивы</title>
</head>

<body>
<?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);
?>
</body>
</html>

Где, print_r($Names) — функция вывода сведений о переменных

В окне веб-браузера это будет выглядеть ТАК.

Как видите, тут никаких особенностей нет, все работает совершенно аналогично спискам, только с нецифровыми ключами. Возможно, вы скажете, что это не совсем так: например, нельзя воспользоваться циклом for, как мы это делали раньше, для вывода всех персоналий, и окажетесь правы. Вскоре мы рассмотрим целых три приема, с помощью которых можно перебрать все элементы массива. Вы, скорее всего, будете применять их даже и для списков — настолько они удобны и универсальны, а к тому же и работают быстрее, чем последовательный перебор в цикле for с использованием $i.

Как мы уже знаем обращение к массивам происходит с помощью индексов. Однако в случае обращения к несуществующему элементу выводится сообщение об ошибке. В ряде случаев это не желательно. Чтобы подавить возможное сообщение, используется символ @, например:

@$anyelement = $Names[5];

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

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

$Names["Иванов"]="Иван";
$Names["Петров"]="Сергей";
$Names["Сидоров"]="Дмитрий";

Теперь сделаем следующую запись:

echo $Names["Иванов"];
echo $Names["Петров"];
echo $Names["Сидоров"];
echo $Names["Федоров"];

У нас получилась следующая конструкция:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Массивы</title>
</head>

<body>
<?php
$Names["Иванов"]="Иван";
$Names["Петров"]="Сергей";
$Names["Сидоров"]="Дмитрий";
echo $Names["Иванов"];
echo '<br>';
echo $Names["Петров"];
echo '<br>';
echo $Names["Сидоров"];
echo '<br>';
echo $Names["Федоров"];
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

Идем дальше. Прежде всего обратим внимание: приведенным выше механизмом мы никак не смогли бы создать пустой массив. Однако он очень часто может нам понадобиться, например, если мы не знаем, что раньше было в массиве $Names, но хотим его проинициализировать указанным путем. Кроме того, каждый раз задавать массив указанным выше образом не очень-то удобно — приходится все время однообразно повторять строку $Names...

Поэтому второй способ создания массива — это использование оператора array(). Его мы уже рассматривали.

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

имя_массива[индекс_уровня1] [индекс_уровня2]

Например, если кроме имени о человеке известен также его возраст, то можно инициировать массив $Names так:

$Names["Иванов"]=array('Имя'=>"Иван", 'Возраст'=>"37");
$Names["Петров"]=array('Имя'=>"Сергей", 'Возраст'=>"28");
$Names["Сидоров"]=array('Имя'=>"Дмитрий", 'Возраст'=>"30")

или даже так:

$Names=array(
"Иванов"=>array('Имя'=>"Иван", 'Возраст'=>"37"),
"Петров"=>array('Имя'=>"Сергей", 'Возраст'=>"28"),
"Сидоров"=>array('Имя'=>"Дмитрий", 'Возраст'=>"30")
);

Пример:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Многомерные массивы</title>
</head>

<body>
<?php
$Names=array(
"Иванов"=>array('Имя'=>"Иван", 'Возраст'=>"37"),
"Петров"=>array('Имя'=>"Сергей", 'Возраст'=>"28"),
"Сидоров"=>array('Имя'=>"Дмитрий", 'Возраст'=>"30")
);
echo $Names["Иванов"]["Имя"];
echo '<br>';
echo $Names["Петров"]["Имя"];
echo '<br>';
echo $Names["Сидоров"]["Возраст"];
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

а можно и так:

$Names=array(
array("Иванов", "Иван", 37),
array("Петров", "Сергей", 28),
array("Сидоров", "Дмитрий", 30),
);

Пример:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Многомерные массивы</title>
</head>

<body>
<?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];
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

Отображение массивов PHP

Для просмотра структуры и значений элементов массива(это может понадобиться при отладке программ) используются функции print_r() и var_dump().

  • var_dump(cписок_переменных) — выводит информацию о массивах(тип переменной(array), количество элементов массива и список сведений об элементах вида индекс = > элемент).
  • print_r(cписок_переменных) — выводит список вида индекс = > элемент без указания типов и других характеристик элементов
  • .

Для вывода значений элементов массива можно воспользоваться операторами цикла for и while.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Многомерные массивы</title>
</head>

<body>
<?php
$Names=array("Сидоров", "Дмитрий", 30);
$i=0;
while($i<count($Names)){
echo $Names[$i], '<br>';
$i++;
}
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

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

echo $Names[$i];

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

Пример:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Многомерные массивы</title>
</head>

<body>
<?php
$Names=array("Сидоров", "Дмитрий", 30);
echo "Cотрудник {$Names[0]}, его возраст {$Names[2]} лет";
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.