Массивы в PHP (как и в других языках) представляют собой коллекцию связанных вместе значений. Например в виде массива можно представить меню в ресторане (название блюда — цена) или количество проживающих в городах страны жителей (город страны — количество жителей). Как пояснялось в этой статье , переменная представляет из себя именнованный контейнер в памяти, содержащий определённо значение. В этом смысле массив, это контейнер содержащий множество значений.
Организация массива
Как писалось выше, массив состоит из элементов, каждый из которых имеет ключ и значение. Например массив содержащий информацию о ценах в ресторанном меню может выглядеть так:
Ключ | Значение |
---|---|
breakfast | 700 |
dinner | 1500 |
supper | 1100 |
Массив может иметь только один элемент с заданным ключом, т.е. в приведённом выше массиве не может быть двух элементов с ключом dinner
. При попытке «добавить» второй dinner
, мы просто перезапишем значение уже существующего элемента. В данном примере мы рассмотрели наиболее частый случай организации массива, а именно в виде ассоциативного. Ассоциативный массив удобнее использовать в коде, т.к. его ключи имеют осмысленные наименования (ассоциируются с какими-то частями приложения или данными которые обрабатывает скрипт). Но есть более простой пример массив, это числовые массивы. При их создании не нужно указывать ключ, он задаётся автоматически в виде целого числа, начиная с нуля.
Ключ | Значение |
---|---|
0 | 700 |
1 | 1500 |
2 | 1100 |
Рассмотрим пример:
1 2 3 4 5 6 7 8 9 |
//Пример создания ассоциативного массива $menuPrice = [ 'breakfast' => 700, 'dinner' => 1500, 'supper' => 1100 ]; //Пример создания «числового» массива $prices = [700, 1500, 1100]; |
В первом случае элементы массива представляют из себя пару ключ-значение, где в качестве ключа используются строковые названия «блюд» (приёмов пищи на самом деле, но пусть будет блюд), а значение это цена блюда. Во втором же случае я указал только цены, при этом интерпретатор PHP автоматически проставит ключи элементам массива.
Операции с массивами
Один из случаев ключевой операции с массивами, а именно его создание мы рассмотрели выше. А как ещё можно создать массив? Самый простой случай, это создание пустого массива:
1 2 |
//Создаём пустой массив $array = []; |
Создание и модификация массива
Пустой массив может служить заготовкой под определённую коллекцию данных. Конечно его можно не определять заранее и создать прямо в цикле где он должен заполняться, но тогда это будет менее понятный код.
Вы так же можете заполнить массив на лету, например данными из базы данных:
1 2 3 4 5 6 |
//Заполняем массив данными из БД $users = []; //...некая выборка значения, например пользователей users while($user = $db->query('SELECT * FROM users')->fetch(PDO::FETCH_ASSOC)){ $users[] = $user; } |
Перебор массивов
С другой стороны готовый массив можно перебрать и например вывести его элементы на экран:
1 2 3 4 5 6 7 8 9 |
//Перебор массива $week = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье']; //Выведем список дней недели echo '<ul>'; foreach ($week as $key => $day) { echo '<li>'. $day .'</li>'; } echo '</ul>'; |
Вообще в php существует больше 70 функций для работы с массивами, однако в большинстве случаев вы будет использовать не больше двадцати. Приведу некоторые из них:
- in_array — проверяет присутствие элемента в массиве
- key_exists — проверяет присутствует ли в массиве указанный ключ или индекс
- array_search — осуществляет поиск заданного значения в массиве и возвращает ключ первого найденного значения
- array_merge — объединяет 2 и более массивов в один
- array_chunk — разбивает массив на части
Сортировка массива
Отдельным блоком может идти операции связанные с сортировкой массив. В PHP существует несколько встроенных функций для быстрой сортировки массивов, например по возрастанию/убыванию значения или в алфавитном порядке. Причём сортировка может идти как по ключам массива так и по значениям. Одной из интересных возможностей предоставляет функция usort()
, при помощи которой вы можете отсортировать элементы массива используя собственный алгоритм сравнения. Рассмотрим пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//Пользовательская функция сравнения элементов массива function compare($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } //Заданный массив с числами идущими не по порядку $numbers = [3, 2, 5, 6, 1]; //Вызываем функцию usort() передав ей массив и имя нашей пользовательской функции сравнения usort($numbers, 'compare'); |
В результате выполнения данного примера получим такой массив:
1 2 3 4 5 6 7 |
array(5) { [0]=>int(1) [1]=>int(2) [2]=>int(3) [3]=>int(5) [4]=>int(6) } |
Как вы понимаете данный пример максимально упрощён. Но внутри вашей функции compare()
можно реализовать любой алгоритм сравнения элементов. Главное правильно возвращать значение, ноль — если элементы не отличаются и их не надо менять местами и 1 или -1 если нужно изменить порядок элементов.
Вы так же можете пробросить в тело функции compare()
внешнюю переменную используя анонимную функцию и ключевое слово use
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//Пользовательская функция сравнения элементов массива $params = ['min_value'=>0, 'max_value'=>3]; function compare($params){ return function ($a, $b) use ($params) { if ($a == $b) { return 0; } if($a < $b && $a >= $params['min_value'] && $a <= $params['max_value']){ return -1; } else { return 1; } }; } //Заданный массив с числами идущими не по порядку $numbers = [3, 2, 5, 6, 1]; //Вызываем функцию usort() передав ей массив и имя нашей пользовательской функции сравнения usort($numbers, compare($params)); |
Как видите теперь compare()
принимает параметры $params
и возвращает анонимную функцию в которой уже реализован ваш алгоритм сравнения в котором используются переданные параметры. Результат при таком алгоритме изменится:
1 2 3 4 5 6 7 |
array(5) { [0]=>int(1) [1]=>int(2) [2]=>int(3) [3]=>int(6) [4]=>int(5) } |
Грубо говоря сортировка по возрастанию шла пока значение $a
попадало в диапазон от 0 до 3-х.
Глобальные массивы
В PHP начиная с версии 4 ввели такой сущность как «суперглобальные массивы». Это особые переменные доступные в любой части приложения и содержат информацию, например о состоянии сервера (массив $_SERVER) сессии, куках или переданных от пользователя запросах, одним словом о состоянии среды выполнения приложения. На данный момент в PHP доступно девять суперглобальных массивов:
Наименование | Описание массива |
$GLOBALS | Этот массив содержим все переменные объявленные в скрипте, при этом имена переменных являются ключами этого массива. |
$_SERVER | Данный массив содержит всю информацию о сервере, а так же настройки среды в которой выполняется скрипт |
$_GET | Массив переменных переданных PHP скрипту по средствам GET запроса (через адресную строку браузера или другими методами, например curl()) |
$_POST | Так же как и GET содержит переданные скрипту переменные, только уже методом POST |
$_COOKIE | Содержим coockies-ы пользователя |
$_REQUEST | Объединяет в себе массивы $GET, $POST и $COOKIE. Не рекомендуется использовать, не безопасно, хотя и удобно. |
$_FILES | Содержим список файлов загружаемых на сервер через веб-формы (имя, временный путь, размеры и т.д.) |
$_ENV | Содержит переменные окружения в котором запущен PHP скрипт |
$_SESSION | В данном массиве содержаться все переменные сессии текущего пользователя |
Чаще всего, вы будете сталкиваться с массивами $_GET и $_POST т.к. с их помощью в скрипты на сервере передаются данные от клиентской части (через веб-формы).
Многомерные массивы
Как вы уже знаете, элементы массива могут содержать в качестве значения данные любого типа, строки, числа, логические, в том числе и другие массивы. Массив состоящий из других массивов называется многомерным или вложенным массивом. На практике используется 2-3 уровня вложенности для хранения каких-либо связанных структурных данных (например данных о покупателях магазина или каталоге товаров), обработка массивов большей вложенности усложняется и используется не часто.
Давайте разберёмся как создавать и взаимодействовать с многомерными массивами.
Создание многомерных массивов
В первую очередь создадим простой двумерный массив сотрудников организации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//Многомерный массив сотрудников $multilevelArray1 = [ [ 'username'=>'Александр', 'age' => 32, 'position' => 'Программист' ], [ 'username'=>'Анастасия', 'age' => 33, 'position' => 'Логопед' ], [ 'username'=>'Елена', 'age' => 29, 'position' => 'Бухгалтер' ] ]; |
Массив $multilavelArray
содержим в себе три других массива описывающих некоторые параметры сотрудников, а именно имя, возраст и должность. Эти данные могли бы быть получены из БД или сложной веб-формы. Обратите внимание что в «родительском» массиве мы не указывали символьных ключей, поэтому массивам внутри были просто присвоены числовые индексы 0, 1, 2. Давайте теперь распределим наших сотрудников по отделам и добавим ещё одного сотрудника.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//Многомерный массив сотрудников $multilevelArray2 = [ 'DEPARTMENT_IT' => [ [ 'username'=>'Александр', 'age' => 32, 'position' => 'Программист' ] ], 'DEPARTMENT_EDUCATION'=> [ [ 'username'=>'Анастасия', 'age' => 33, 'position' => 'Логопед' ] ], 'DEPARTMENT_FINANCE' => [ [ 'username'=>'Екатерина', 'age' => 39, 'position' => 'Главный бугалтер' ], [ 'username'=>'Елена', 'age' => 29, 'position' => 'Бухгалтер' ] ] ]; |
Теперь мы имеем многомерный массив в котором на «первом уровне» хранятся отделы компании, а уже внутри отделов сотрудники. При этом отдел имеет символьный ключ, например DEPARTMENT_IT
— отдел IT. Немного усложним наш пример и добавим информацию о наименовании отделов и времени работы, а сотрудников отдела поместим на уровень ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
$multilevelArray3 = [ 'DEPARTMENT_IT' => [ 'TITLE' => 'It отдел', 'WORK_TIME' => 'с 09:00 до 23:00', 'STAFF' => [ [ 'username'=>'Александр', 'age' => 32, 'position' => 'Программист' ] ] ], 'DEPARTMENT_EDUCATION'=> [ 'TITLE' => 'Отдел образования и развития', 'WORK_TIME' => 'с 08:00 до 17:00', 'STAFF' => [ [ 'username'=>'Анастасия', 'age' => 33, 'position' => 'Логопед' ] ] ], 'DEPARTMENT_FINANCE' => [ 'TITLE' => 'Отдел бухгалтерии', 'WORK_TIME' => 'с 09:00 до 18:00', 'STAFF' =>[ [ 'username'=>'Екатерина', 'age' => 39, 'position' => 'Главный бухгалтер' ], [ 'username'=>'Елена', 'age' => 29, 'position' => 'Бухгалтер' ] ] ] ]; |
Как видите используя многомерные массивы можно строить довольно сложные структуры данных с которыми в последствии предстоит работать нашему веб-приложению.
Доступ к элементам многомерного массива
Рассмотрим как получить доступ к элементам многомерного массива. В качестве примера возьмём выше описанные массивы сотрудников компании. Но перед этим предлагаю набросать небольшую функцию, которая позволит удобно просматривать содержимое переменных в вашем коде. Я часто использую её в работе:
1 2 3 4 5 6 7 8 9 10 11 |
/** * Обёртка для print_r() и var_dump() * @param $val - значение * @param string $name - заголовок * @param bool $mode - использовать var_dump() или print_r() * @param bool $die - использовать die() после вывода */ function print_p($val, $name = 'Содержимое переменной', $mode = false, $die = false){ echo '<pre>'.(!empty($name) ? $name.': ' : ''); if($mode) { var_dump($val); } else { print_r($val); } echo '</pre>'; if($die) die; } |
Эта функция простая обёртка для просмотра содержимого переменной при помощи print_r()
или var_dump()
тегов <pre>...</pre>
. Берите на вооружение.
И так, давайте узнаем имена и возраст всех сотрудников из первого двумерного массива:
1 2 3 4 |
echo '<h3>Сотрудники компании</h3>'; foreach ($multilevelArray1 as $key => $item) { echo '<b>Имя:</b> ' . $item['username'] . ' <b>должность:</b> ' . $item['position'] . '<br/>'; } |
В результате выполнения этого кода, получим такой список в html:
Представьте что мы не знаем что содержится в переменной $multilevelArray3
, но нас просят как-то представить структуру компании на странице «О компании». Тут нам пригодится функция print_p()
описанная выше. Вызовем следующий код:
1 2 |
//Просмотр переменной $multilevelArray3 print_p($multilevelArray3, 'Структура компании', true); |
В результате, на экране мы увидим такое сообщение:
Мы видим что в $multilevelArray3
хранится многоуровневый массив, на первом уровне которого находятся разделы компании с описанием, а внутри разделов по ключу STAFF доступен массив сотрудников этого отдела. Зная это мы можем написать следующий код, чтобы представить структуру компании:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
echo '<h2>Компания ООО "Рога-и-Копыта"</h2>'; foreach ($multilevelArray3 as $departmentKey => $department) { ?> <div class="department"> <h3><?=$department['TITLE']?></h3> <i>Режим работы: <?=$department['WORK_TIME']?></i> <? if(count($department['STAFF']) > 0) { //проверяем есть ли сотрудники в отделе ?> <div class="staff"> <h5>В отделе работают:</h5> <? foreach ($department['STAFF'] as $key => $item) { ?> <div class="item"> <ul> <li><b>Имя:</b> <?=$item['username'];?></li> <li><b>Полных лет:</b> <?=$item['age'];?></li> <li><b>Должность:</b> <?=$item['position'];?></li> </ul> </div><br/> <? } ?> </div> <? } ?> </div> <hr> <? } ?> |
Получим такую страницу:
Таким образом можно вывести например страницу контактов сайта, на которой должны быть «координаты» должностных лиц отвечающих за то или иное направление деятельности компании. Оформление сами понимаете зависит от вашей фантазии и дизайна сайта.
Обработка многомерного массива
Один из примеров обработки массива был представлен выше, когда мы просто вывели на экран содержимое многомерного массива в удобном для пользователя виде. Однако это далеко не всё что можно делать с массивами. Например мы можешь осуществить некий поиск по элементам узнать сколько сотрудников старше 30 лет работает в нашей компании:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//Количество искомых сотрудников $counter = 0; //Обработка каждого элемента массива array_walk_recursive( $multilevelArray3, function ($value, $key) use (&$counter) { if($key == 'age'){ if($value > 30){ $counter++; } } }, $counter); echo 'Количество сотрудников старше 30 лет: ' . $counter; |
Здесь мы применили функцию array_walk_recursive() которая обходит каждый элемент массива вне зависимости от его вложенности и применяет к элементу пользовательскую функцию. В данном случае лямбда функция проверяет что текущий элемент это возраст и что его значение больше 30 и наращивает определённый во вне счётчик. Чтобы получить доступ в область видимости где применён счётчик используется конструкция use
и ссылка на переменную &$counter
. В результате вы увидите сообщение: Количество сотрудников старше 30 лет: 3.
Существует множество примеров обработки массивов в PHP, но они выходят за рамки данной статьи. Для лучшего усвоение материала, попробуйте пройти небольшой тест и ответить на вопросы по статье:
Проверка знаний по массивам в PHP
Правильный ответ, функция in_array(). Массив $arr = ['Александр', 'Иван', 'Роман']; , если вызвать in_array('Роман', $arr); она вернёт true если элемент в массиве есть, в противном случае false.
Please select 2 correct answers
Оставьте первый комментарий!