Массивы в PHP

Эта статья призвана помочь начинающим программистам, столкнувшимся с понятием массива. Под массивом мы подразумеваем разновидность переменной, которая систематизированно хранит в себе несколько упорядоченных элементов, состоящих из ключа и значения. Проще говоря, набор разных дискретных величин и\или объектов, которые мы объединили в одну совокупность – это массив.

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

В PHP массив объявляется при помощи языковой конструкции array(), в круглых скобках которой указывается набор значений формата key=>value, где key и value – параметры, обозначающие соответственно ключ и значение. Ключи могут быть типа integer – в таком случае они называются индексами; или string -- в этом случае массив называется ассоциативным. Значения value могут принимать любой тип.

Пример 1.

В этом примере мы покажем разные способы задания простого массива.

<?php
$arr0 = array('Head', 'Body', 'Tale');
 
$arr1 = array(
    "1_key" => "1_value",
    "2_key" => "2_value",
);//ассоциативный массив имеет строковый тип ключей
$arr2[1] = "otli4no"; 
$arr2[3] = "xorosho"; 
$arr2[]="neud"; // добавляет новый элемент в массив 
$arr2[5] = "udovletvoritelno";
/*по умолчанию в С-образных языках индексация элементов начинается с нулевого, но мы можем их переиндексировать на своё усмотрение.*/
 
echo $arr0[1]."\n";//заметим, что выводится именно элемент с индексом [1] 
 
echo "$arr2[1] $arr2[3] $arr2[4] $arr2[5]"."\n"; 
// а здесь элементы массива выводятся как обычные переменные
 
echo "{$arr1['1_key']} ".$arr1['2_key']."\n";
/*выводит элементы ассоциативного массива в строку*/
 ?>

Результат:

Body
otli4no xorosho neud udovletvoritelno
1_value 2_value

Внимание!

Посмотрите в примере на элемент массива $arr2[]=”neud” с отсутствующим индексом. В то же время мы запросили вывести элемент $arr2[4] и в результате в выводе имеем наш $arr2[]. Это говорит о том, что параметр key не является обязательным. Если индекс/ключ не указан, PHP автоматически выберет наименьший незанятый числовой индекс, то есть предыдущий доступный индекс+1. Если целочисленных индексов в массиве еще нет, то ключом будет 0 (ноль).

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

Для работы с массивами существует превеликое множество полезных функций. В дальнейшем мы рассмотрим некоторые из них. А сейчас попробуем написать скрипт, который отображает оценки учеников 11-х классов по результатам ГИА. Для этого заведём трёхмерный ассоциативный массив.

Пример 2.

<?php 
  $gia = array( //наш трёхмерный массив ГИА
 
"11-A" => array( //двумерный массив 11-А класса
 
"математика" => array( //простой ассоциативный массив оценок по математике 
"Кукушкин Пётр" =>5,
"Карасина Мария" =>4, 
"Лежебоков Андрей" =>3,
"Донцова Дарья" =>5,
"Орхипцев Антон"=>2,
"Арбузова Марта"=>4),
 
 
"русский" =>   array( //массив оценок по русскому
 "Кукушкин Пётр" =>4,
"Карасина Мария" =>5, 
"Лежебоков Андрей" =>2)),
 
 /*по аналогии повторяем с 11-Б классом*/
"11-Б" => array( 
"английский" => array( 
"Кущина Валерия" =>3,
"Кержаков Ахмет" =>4, 
"Цепеш Владислав" =>5),
 
"физика" => array(
"Кущина Валерия" =>5,
"Кержаков Ахмет" =>2, 
"Цепеш Владислав" =>4))
);

Так как у ассоциативных массивов нет индексов, для обхода и простого перебора их введён специальный вид цикла — foreach, который работает только с массивами и объектами. Конструкция "$key =>" позволяет получить доступ к ключу массива, но может быть опущена.

echo "Оценки учеников 11-А за итоговую аттестацию по математке:\n";
foreach($gia["11-A"]["математика"] as $key => $value) 
  { 
     echo "$key -- $value  \n"; 
  } 
 echo "Оценки учеников 11-А за итоговую аттестацию по русскому языку:\n";
 foreach($gia["11-A"]["русский"] as $key => $value) 
  { 
     echo "$key -- $value  \n"; 
  } 
 
 echo "Оценки учеников 11-Б за итоговую аттестацию по английскому:\n";
foreach($gia["11-Б"]["английский"] as $key => $value) 
  { 
     echo "$key -- $value  \n"; 
  } 
 echo "Оценки учеников 11-Б за итоговую аттестацию по физике:\n";
foreach($gia["11-Б"]["физика"] as $key => $value) 
  { 
     echo "$key -- $value  \n"; 
  } 
 ?>

Результат:

Оценки учеников 11-А за итоговую аттестацию по математике:
Кукушкин Пётр -- 5  
Карасина Мария -- 4  
Лежебоков Андрей -- 3 
Донцова Дарья -- 5
Орхипцев Антон -- 2
Арбузова Марта -- 4

И т.д.

Сортировка является одной из наиболее важных процедур при работе с массивами. Чтобы осознать ее важность достаточно вспомнить о таких действиях, как, например, сортировка фильмов в алфавитном порядке или сортировка каких-либо цен по возрастанию или убыванию и т.д. В php есть много функций сортировки массивов, из которых можно выбрать оптимально подходящую: по ключу\ значению, по возрастанию\убыванию, сохраняют ли связть ключ-значение. Отсортируем учеников в алфавитном порядке с помощью функции ksort().
Но сперва уничтожим в списках троечников и двоечников с помощью функции unset(), так же с помощью этой функции можно удалить массив целиком. Ну и наконец подсчитаем количество отличников и хорошистов с помощью функции array_count_values(), которая возвращает ассоциативный массив со значениями исходного в качестве ключей и их количества в качестве значений.

До этого мы выводили результат при помощи цикла, однако в PHP предусмотрена специальная функция для вывода дампа массива print_r().

Пример 3.

<?php
   ksort($gia["11-A"]["математика"]);
/*ksort() cортирует массив по ключам, сохраняя отношения между ключами и значениями. Эта функция полезна, в основном, для работы с ассоциативными массивами.*/
foreach($gia["11-A"]["математика"] as $key => $value) 
  { 
     if ($value < 4) { unset($gia["11-A"]["математика"][$key]);
//если оценка <4, то удаляем элемент
 
     }};
print_r(array_count_values($gia["11-A"]["математика"])); //считаем отличников и хорошистов
?>

Результат:

Array
(
    [Арбузова Марта] => 4
    [Донцова Дарья] => 5
    [Карасина Мария] => 4
    [Кукушкин Пётр] => 5
)
Array
(
    [4] => 2
    [5] => 2
)

Очевидно, остались только круглые отличники и хорошисты по математике, чьи фамилии выведены в алфавитном порядке, а точное количество учеников, получивших 4 и 5, подсчитано ниже. Попрактикуйтесь: проделайте аналогичные манипуляции со списком прошедших аттестацию в 11-Б самостоятельно.
Как видите, работать с массивами совсем несложно.
Спасибо за внимание!