Главная страница IT-студия  
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создание сайтов. Авторы: Кузнецов М.В., Симдянов И.В. Головоломки на PHP для хакера (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры . Авторы: Кузнецов М.В., Симдянов И.В. PHP. Народные советы. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование: ступени карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Security & Cracking Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
Консультации от известных специалистов и авторов многих книг

Информационный портал
«SoftTime-INFO»




| Статьи о PHP | Массивы

Массивы

Авторы - Мухаметшин Д.Ф., Симдянов И.В.

Определение массива

Рано или поздно каждому программисту приходится сталкиваться с таким понятием как массив. Массивом можно считать разновидность переменных, в котором храниться несколько значений. Массив определяется при помощи конструкции 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(=> "PHP"
               
=> "MySQL"
               
=> "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(9876543210);
  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(9876543210);
  unset(
$arr);
  if(isset(
$arr)) echo "Массив определён";
  else echo 
"Массив не определён";
?>

До этого массивы выводились при помощи цикла, однако в PHP предусмотрена специальная функция для вывода дампа массива print_r(). Функция ориентирована на вывод в консольный поток, поэтому при выводе результатов в окно браузера лучше обрамить её тэгами <pre> и </pre>:

$arr[] = "345";
$arr[] = "mail@mail.ru";
$arr[] = "http://www.softtime.ru";
$arr[] = "login";
$arr[] = "password";
echo "

";
print_r($arr);
echo "
";
?>

Результат работы скрипта выглядит следующим образом:

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(12345678910);
  
// Генерируем случайный индекс массива
  
$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($a2// вывод 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
)

Русская версия English

 
  Rambler's Top100 Яндекс.Метрика Яндекс цитирования