Массивы в 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-Б самостоятельно.
Как видите, работать с массивами совсем несложно.
Спасибо за внимание!