Массивы в примерах
Определение массива
Рано или поздно каждому программисту приходится сталкиваться с таким понятием как массив. Массивом можно считать разновидность переменных, в котором храниться несколько значений. Массив определяется при помощи конструкции array(), в круглых скобках которой указываются его значения:
<?php
$arr = array('PHP', 'MySQL', 'Apache');
?>
или
<?php
$arr[] = "PHP";
$arr[] = "MySQL";
$arr[] = "Apache";
?>
В C-подобных языках программирования, индекс массива традиционно начинается с 0. Это означает, что если мы захотим вывести первое значение массива "PHP", нам потребуется обратиться к нулевому индексу:
<?php
echo $arr[0]; // PHP
?>
Если требуется начать массив с другого индекса, например, с 1, то необходимо явно это указать в конструкции array():
<?php
$arr = array(1 => "PHP",
2 => "MySQL",
3 => "Apache");
?>
или
<?php
$arr[1] = "PHP";
$arr[2] = "MySQL";
$arr[3] = "Apache";
?>
Элементы массива можно использовать в двойных кавычках как обычные переменные, так код
<?php
echo "$arr[1] $arr[2] $arr[3]";
?>
или через цикл:
<?php
for ($i = 1; $i <= 3; $i++)
{
echo $arr[$i]." ";
}
?>
Следует заметить, что число элементов в массиве не обязательно знать заранее — его можно вычислить при помощи функции count():
<?php
for ($i = 1; $i <= count($arr); $i++)
{
echo $arr[$i]." ";
}
?>
Выведет строку "PHP MySQL Apache". В качестве индексов массива могут выступать не только числа, но и строки:
<?php
$arr = array("first" => "PHP",
"second" => "MySQL",
"third" => "Apache");
?>
или
<?php
$arr["first"] = "PHP";
$arr["second"] = "MySQL";
$arr["third"] = "Apache";
?>
В этом случае массив называется ассоциативным, а его индексы называются ключами. Для вывода элемента массива в строке кавычки (ни двойные, ни одинарные) указывать не следует:
<?php
echo "$arr[first] $arr[second] $arr[third]";
?>
Так как у ассоциативных массивов нет индексов, для обхода их введён специальный вид цикла — foreach:
<?php
foreach($arr as $key => $value)
{
echo "$key = $value <br />";
}
?>
В результате работы цикла будет выведено три строки
first = PHP
second = MySQL
third = Apache
Конструкция "$key =>", позволяющая получить доступ к ключу массива на каждом из циклов является не обязательно и может быть опущена:
<?php
foreach($arr as $value)
{
echo "$value <br />";
}
?>
Ряд функций, также позволяют возвращать массивы, например, функция file(), которая читает файл и возвращает его содержимое в виде массива. Каждый элемент массива соответствует одной строке.
<?php
$arr = file("text.txt");
for($i = 0; $i < count($arr); $i++)
{
echo $arr[$i]."<br />";
}
?>
Другой полезной функцией является функция explode(), которая позволяет разбить строку на несколько фрагментов, каждый из которых помещается в отдельный элемент массива:
<?php
$str = "345|mail@mail.ru|http://www.softtime.ru|login|password";
$arr = explode("|",$str);
for($i = 0; $i < count($arr); $i++)
{
echo $arr[$i]."<br />";
}
?>
Результат работы скрипта может выглядеть следующим образом:
345
mail@mail.ru
http://www.softtime.ru
login
password
Существует и обратная функция — implode(), которая объединяет, элементы массива в строку, используя для этого заданный разделитель:
<?php
$arr[] = "345";
$arr[] = "mail@mail.ru";
$arr[] = "http://www.softtime.ru";
$arr[] = "login";
$arr[] = "password";
$str = implode("##",$arr);
echo $str; //345##mail@mail.ru##http://www.softtime.ru##login##password
?>
Замечание
Вообще функций, которые потрошат строку превеликое множество, рассмотрение всех их выходят за рамки данной статьи.
Удалить отдельный элемент массива можно при помощи функции unset(), а проверить существование массива можно при помощи функции isset(). Определим массив из 10 элементов и уничтожим каждый чётный элемент.
<?php
$arr = array(9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
unset($arr[0], $arr[2], $arr[4], $arr[6], $arr[8]);
// Проверяем существуют ли элементы массива
for($i = 0; $i < 10; $i++)
{
if(isset($arr[$i])) echo "Элемент $arr[$i] определён <br />";
else echo "Элемент $arr[$i] не определён <br />";
}
?>
Результатом работы скрипта из будут следующие строки
Элемент $arr[0] не определён
Элемент $arr[1] определён
Элемент $arr[2] не определён
Элемент $arr[3] определён
Элемент $arr[4] не определён
Элемент $arr[5] определён
Элемент $arr[6] не определён
Элемент $arr[7] определён
Элемент $arr[8] не определён
Элемент $arr[9] определён
При помощи функции unset() можно уничтожить весть массив сразу.
<?php
$arr = array(9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
unset($arr);
if(isset($arr)) echo "Массив определён";
else echo "Массив не определён";
?>
До этого массивы выводились при помощи цикла, однако в PHP предусмотрена специальная функция для вывода дампа массива print_r(). Функция ориентирована на вывод в консольный поток, поэтому при выводе результатов в окно браузера лучше обрамить её тэгами <pre> и </pre>:
<?php
$arr[] = "345";
$arr[] = "mail@mail.ru";
$arr[] = "http://www.softtime.ru";
$arr[] = "login";
$arr[] = "password";
echo "<pre>";
print_r($arr);
echo "</pre>";
?>
Результат работы скрипта выглядит следующим образом:
Array
(
[0] => 345
[1] => mail@mail.ru
[2] => http://www.softtime.ru
[3] => login
[4] => password
)
Многомерные массивы
В качестве элементов массива могут выступать не только скалярные величины, но и сами массивы. В этом случае получаются так называемые многомерные массивы.
Пусть необходимо получить такую таблицу:
Имя | Профессия | Зарплата |
Вася | Слесарь | 2500 |
Миша | Строитель | 3000 |
Андрей | Шофер | 2700 |
Для этого создадим двумерный массив:
<?php
$arr = array( array(‘Вася’, ‘слесарь’, 2500 ),
array(‘Миша’,’строитель’, 3000),
array(‘Андрей’, ‘шофер’, 2700));
?>
Теперь таблицу можно вывести при помощи следующего кода:
<?php
for ($i = 0; $i < 3; $i++)
{
for ($j=0; $j <3; $j++)
{
echo ' | '.$arr[$i][$j];
}
echo '<br />';
}
?>
Результат:
| Вася | слесарь | 2500
| Миша | строитель | 3000
| Андрей | шофер | 2700
Также можно использовать трехмерные, четырехмерные и т.п. массивы.
Операции над массивами (сборник рецептов)
1) Определения числа элементов в массиве count():
Создадим массив $name:
<?php
$name = array('Boss', 'Lentin', 'NAV', 'Endless', 'Dragons', 'SiLeNT', 'Doctor', 'Lynx');
?>
Чтобы определить число элементов в массиве можно поступить следующим образом:
<?php
echo ‘Число элементов в массиве - ’.count($name);
?>
Результат:
Число элементов в массиве – 8
2) Объединение массивов
a) Создадим два ассоциативных массива $a и $b:
<?php
$a = array(“a” => ”aa”, “b” => “bb”);
$b = array(“c” => ”cc”, “d” => “dd”);
?>
Пусть необходимо создать массив $c, которые будет содержать как элементы массива $a так и массива $b:
<?php
$a = array("a"=>"aa", "x"=>"xx");
$b = array("c"=>"cc", "d"=>"dd");
$c = $a + $b;
echo "<pre>";
print_r($c);
echo "</pre>";
?>
Результат:
Array
(
[a] => aa
[x] => xx
[c] => cc
[d] => dd
)
b) Создадим два числовых массива $a и $b:
<?php
$a = array(10,20);
$b = array(100,200,300,400,500);
?>
Их уже не получится объединить при помощи конструкции $c = $a + $b;. Для их объединения потребуется воспользоваться функцией array_merge():
<?php
$c = array_merge($a,$b);
?>
3) Сортировка массива
Воспользуемся массивом $name:
<?php
$name = array('Boss', 'Lentin', 'NAV', 'Endless', 'Dragons', 'SiLeNT', 'Doctor', 'Lynx');
?>
Пусть требуется отсортировать массив в алфавитном порядке, для этого можно воспользоваться следующим кодом:
<?php
sort($name);
echo "<pre>";
print_r($name);
echo "</pre>";
?>
Результат:
Array
(
[0] => Boss
[1] => Doctor
[2] => Dragons
[3] => Endless
[4] => Lentin
[5] => Lynx
[6] => NAV
[7] => SiLeNT
)
Пусть необходимо из массива $name выбрать самый короткий элемент(у которого наименьшее количество символов), в этом случае можно воспользоваться кодом:
<?php
$name = array('Boss', 'Lentin', 'NAV', 'Endless', 'Dragons', 'SiLeNT', 'Doctor', 'Lynx');
$min = strlen($name[0]);
$nam = $name[0];
for ($i=1; $i < count($name); $i++)
{
$len = strlen($name[$i]);
if ($len < $min)
{
$nam = $name[$i];
$min = strlen($nam);
}
}
echo 'Наименьшая длина - '.$nam;
?>
4) Перемещение внутри массива
Создадим массив $num:
<?php
$num = array(1,2,3,4,5,6,7,8,9,10);
?>
Пусть требуется отобразить элементы массива в обратном порядке, в этом случае можно воспользоваться кодом:
<?php
$end = end($num);
While ($end)
{
echo $end.' - ';
$end = prev($num);
}
?>
Результат:
10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 – 1
Приведённый выше код можно модифицировать:
<?php
$num = range(1,10);
print_r (array_reverse($num));
?>
Функция range(1,10) создает массив (1,2,3,4,5,6,7,8,9,10) со случайным расположением элементов. Функция array_reverse() принимает массив и располагает элементы в обратном порядке (10,9,8,7,6,5,4,3,2,1)
Функции next(), each() перемещают указатель на один элемент вперед. Функция reset() возвращает указатель на 1 элемент в массиве. Воспользуемся массивом $num:
<?php
$num = array(1,2,3,4,5,6,7,8,9,10);
?>
Пусть необходимо вывести все элементы по порядку, и на последнем элементе массива вернуть указатель на первый элемент массива. Эту операцию можно осуществить при помощи следующего кода:
<?php
$i=0; //Индекс 1 элемента
while ($i < count($num))
{
echo $num[$i].' ';
$i++;
//Проверка если $i равен числу элементов в массиве
//тогда выводим последний элемент и возвращаем указатель
if ($num[$i] == count($num))
{
echo $num[$i];
reset ($num);
echo '<br />'."Конец массива";
exit();
}
}
?>
Результат:
1 2 3 4 5 6 7 8 9 10
Конец массива
5) Перемешивание элементов в массиве shuffle()
Функция shuffle() перемешивает значения в массиве, и если массив ассоциативный то возвращает его как список:
<?php
$a = array(43,'PHP',4,57,'Boss',90);
shuffle($a);
foreach ($a as $n) echo "$n ";
?>
6) Случайный элемент массива
Если имеется готовый массив, из которого необходимо вывести один случайный элемент, для этого необязательно перемешивать весь массив при помощи функции shuffle(), достаточно сгенерировать случайный индекс массива:
<?php
// Определяем массив
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Генерируем случайный индекс массива
$index = rand(0,count($arr) - 1);
// Выводим случайный элемент массива
echo $arr[$index];
?>
7) Получение части массива array_slice()
Создадим массив $a
<?php
$a = array(‘a’,’b’,’3’,’5’,’f’);
?>
Получить часть массива можно при помощи следующего кода:
<?php
$b = array_slice($a, 2) // вывод 3, 5, f
$b = array_slice($a,0,3) // a, b, 3
?>
8) Сериализация массива
Функции serialize() и unserialize() позволяют осуществлять упаковку и распаковку, соответственно, массивов и объектов.
Замечание
Сериализация впервые появилась в объектно-ориентированных библиотеках, (первой из которых была MFC), потом сериализация стала появляться в объектно-ориентированных языках (Java). Идея сериализации заключается в том, что объекты и массивы очень сложны по своей структуре и на сохранения их путём перебора каждого элемента требуется значительный объём кода — самым простым решением является сохранение таких структур в виде единой закодированной последовательности — байт-коде. В PHP функции сериализации упаковывают данные не виде байт-кода, а виде строки.
<?php
$poll[0] = 23;
$poll[1] = 45;
$poll[2] = 34;
$poll[3] = 2;
$poll[4] = 12;
// Упаковываем массив в строку
$str = serialize($poll);
echo $str."<br />";
// Извлекаем массив из строки
$arr = unserialize($str);
print_r($arr);
?>
Результат:
a:5:{i:0;i:23;i:1;i:45;i:2;i:34;i:3;i:2;i:4;i:12;}
Array
(
[0] => 23
[1] => 45
[2] => 34
[3] => 2
[4] => 12
)
В дополнение вы можете ознакомиться со всеми функциями массивов PHP в нашем справочнике функций.
Рекомендуем почитать