9. Массивы
Введение
Заголовок раздела «Введение»Массивы — одна из самых важных структур данных в PHP. Они позволяют хранить множество значений под одним именем и эффективно работать с коллекциями данных.
Что вы узнаете
Заголовок раздела «Что вы узнаете»- Создание и использование массивов
- Индексированные и ассоциативные массивы
- Многомерные массивы
- Функции для работы с массивами
- Перебор массивов
- Сортировка и фильтрация
- Практическое применение в WordPress
Типы массивов
Заголовок раздела «Типы массивов»Индексированные массивы
Заголовок раздела «Индексированные массивы»Элементы доступны по числовому индексу (начиная с 0).
<?php// Создание массива$fruits = ["яблоко", "банан", "апельсин"];$fruits = array("яблоко", "банан", "апельсин"); // Старый синтаксис
// Доступ к элементамecho $fruits[0]; // яблокоecho $fruits[1]; // бананecho $fruits[2]; // апельсин
// Изменение элемента$fruits[1] = "груша";echo $fruits[1]; // груша
// Добавление элемента$fruits[] = "киви"; // Добавится в конец$fruits[10] = "манго"; // Добавится с индексом 10
print_r($fruits);?>```text
### Ассоциативные массивы
Элементы доступны по строковым ключам.
```php<?php// Создание ассоциативного массива$user = [ "name" => "Иван", "age" => 25, "city" => "Москва"];
// Доступ к элементамecho $user["name"]; // Иван
// Изменение значения$user["age"] = 26;
// Добавление нового ключа$user["phone"] = "+7 (999) 123-45-67";
// Проверка существования ключаif (isset($user["email"])) { echo "Email существует";}
// Удаление элементаunset($user["phone"]);
print_r($user);?>```text
### Многомерные массивы
Массивы, содержащие другие массивы.
```php<?php// Двумерный массив$users = [ ["name" => "Иван", "age" => 25, "city" => "Москва"], ["name" => "Мария", "age" => 30, "city" => "Санкт-Петербург"], ["name" => "Петр", "age" => 28, "city" => "Казань"]];
// Доступ к элементамecho $users[0]["name"]; // Иванecho $users[1]["age"]; // 30echo $users[2]["city"]; // Казань
// Изменение значения$users[0]["age"] = 26;
// Добавление нового пользователя$users[] = ["name" => "Анна", "age" => 22, "city" => "Новосибирск"];
// Переборforeach ($users as $user) { echo "{$user['name']} ({$user['age']}) - {$user['city']}<br>";}?>```text
## Функции для работы с массивами
### Базовые операции
```php<?php$arr = ["a", "b", "c", "d", "e"];
// Длина массиваecho count($arr); // 5
// Добавление элементовarray_push($arr, "f", "g"); // В конецarray_unshift($arr, "z"); // В начало
// Удаление элементов$last = array_pop($arr); // Удалить и вернуть последний$first = array_shift($arr); // Удалить и вернуть первый
// Удаление по индексуunset($arr[2]);
// Проверка существования элементаif (in_array("b", $arr)) { echo "Найдено!";}
// Поиск ключа по значению$key = array_search("c", $arr); // Вернет индекс или false
// Проверка существования ключаif (array_key_exists("name", $user)) { echo "Ключ существует";}?>```text
### Слияние и объединение
```php<?php$arr1 = [1, 2, 3];$arr2 = [4, 5, 6];
// Слияние массивов$merged = array_merge($arr1, $arr2); // [1, 2, 3, 4, 5, 6]
// Объединение с оператором +$combined = $arr1 + $arr2; // [1, 2, 3] (перезаписывает ключи!)
// Для ассоциативных массивов$user1 = ["name" => "Иван", "age" => 25];
$fullUser = array_merge($user1, $user2);// ["name" => "Иван", "age" => 25, "email" => "[email protected]", "city" => "Москва"]?>```text
### Извлечение частей массива
```php<?php$arr = ["a", "b", "c", "d", "e"];
// Получить часть массива$slice = array_slice($arr, 1, 3); // ["b", "c", "d"] (с индекса 1, 3 элемента)
// Удалить и заменить часть массиваarray_splice($arr, 1, 2, ["x", "y"]); // Заменить 2 элемента с индекса 1print_r($arr); // ["a", "x", "y", "d", "e"]
// Получить ключи и значения$user = ["name" => "Иван", "age" => 25];
$keys = array_keys($user); // ["name", "age"]$values = array_values($user); // ["Иван", 25]
// Перевернуть массив$flipped = array_flip($user); // ["Иван" => "name", 25 => "age"]?>```text
## Перебор массивов
### foreach — основной способ
```php<?php// Перебор значений$fruits = ["яблоко", "банан", "апельсин"];
foreach ($fruits as $fruit) { echo "$fruit<br>";}
// Перебор с ключами$user = ["name" => "Иван", "age" => 25, "city" => "Москва"];
foreach ($user as $key => $value) { echo "$key: $value<br>";}
// Изменение элементов (по ссылке)$numbers = [1, 2, 3, 4, 5];
foreach ($numbers as &$num) { $num = $num * 2;}unset($num); // Важно!
print_r($numbers); // [2, 4, 6, 8, 10]?>```text
### for — для индексированных массивов
```php<?php$fruits = ["яблоко", "банан", "апельсин", "груша"];
for ($i = 0; $i < count($fruits); $i++) { echo "$i: {$fruits[$i]}<br>";}
// Обратный порядокfor ($i = count($fruits) - 1; $i >= 0; $i--) { echo $fruits[$i] . " ";}?>```text
### Итераторы
```php<?php$arr = ["a", "b", "c", "d"];
// current, next, prev, reset, endreset($arr); // Указатель в началоecho current($arr); // "a"
next($arr);echo current($arr); // "b"
end($arr);echo current($arr); // "d"
// each (deprecated в PHP 7.2)// Используйте foreach вместо each?>```text
## Сортировка массивов
### Простая сортировка
```php<?php$numbers = [5, 2, 8, 1, 9];
// По возрастаниюsort($numbers); // [1, 2, 5, 8, 9]
// По убываниюrsort($numbers); // [9, 8, 5, 2, 1]
// Для ассоциативных массивов$ages = ["Иван" => 25, "Мария" => 30, "Петр" => 20];
// Сортировка по значениям (сохраняя ключи)asort($ages); // ["Петр" => 20, "Иван" => 25, "Мария" => 30]arsort($ages); // ["Мария" => 30, "Иван" => 25, "Петр" => 20]
// Сортировка по ключамksort($ages); // По возрастанию ключейkrsort($ages); // По убыванию ключей?>```text
### Пользовательская сортировка
```php<?php$users = [ ["name" => "Иван", "age" => 25], ["name" => "Мария", "age" => 30], ["name" => "Петр", "age" => 20]];
// Сортировка по возрастуusort($users, function($a, $b) { return $a["age"] <=> $b["age"];});
print_r($users);// [// ["name" => "Петр", "age" => 20],// ["name" => "Иван", "age" => 25],// ["name" => "Мария", "age" => 30]// ]
// Сортировка по нескольким полямusort($users, function($a, $b) { if ($a["age"] == $b["age"]) { return $a["name"] <=> $b["name"]; } return $a["age"] <=> $b["age"];});?>```text
## Фильтрация и преобразование
### array_filter — фильтрация
```php<?php$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// Только четные числа$even = array_filter($numbers, function($n) { return $n % 2 == 0;});
print_r($even); // [2, 4, 6, 8, 10]
// Фильтрация пользователей$users = [ ["name" => "Иван", "age" => 17], ["name" => "Мария", "age" => 25], ["name" => "Петр", "age" => 30]];
// Только взрослые$adults = array_filter($users, function($user) { return $user["age"] >= 18;});?>```text
### array_map — преобразование
```php<?php$numbers = [1, 2, 3, 4, 5];
// Удвоить каждое число$doubled = array_map(function($n) { return $n * 2;}, $numbers);
print_r($doubled); // [2, 4, 6, 8, 10]
// Преобразование пользователей$users = [ ["name" => "Иван", "age" => 25], ["name" => "Мария", "age" => 30]];
$names = array_map(function($user) { return $user["name"];}, $users);
print_r($names); // ["Иван", "Мария"]?>```text
### array_reduce — свертка
```php<?php$numbers = [1, 2, 3, 4, 5];
// Сумма всех элементов$sum = array_reduce($numbers, function($carry, $item) { return $carry + $item;}, 0);
echo $sum; // 15
// Произведение$product = array_reduce($numbers, function($carry, $item) { return $carry * $item;}, 1);
echo $product; // 120
// Конкатенация строк$words = ["Hello", "World", "PHP"];
$sentence = array_reduce($words, function($carry, $word) { return $carry . " " . $word;}, "");
echo trim($sentence); // "Hello World PHP"?>```text
## Практические примеры
### Группировка данных
```php<?php$orders = [ ["customer" => "Иван", "product" => "Ноутбук", "amount" => 1000], ["customer" => "Мария", "product" => "Мышь", "amount" => 50], ["customer" => "Иван", "product" => "Клавиатура", "amount" => 150], ["customer" => "Петр", "product" => "Монитор", "amount" => 500], ["customer" => "Мария", "product" => "Наушники", "amount" => 100]];
// Группировка по клиенту$byCustomer = [];
foreach ($orders as $order) { $customer = $order["customer"];
if (!isset($byCustomer[$customer])) { $byCustomer[$customer] = []; }
$byCustomer[$customer][] = $order;}
print_r($byCustomer);?>```text
### Индексирование массива
```php<?php$users = [];
// Индексация по ID$usersById = [];
foreach ($users as $user) { $usersById[$user["id"]] = $user;}
// Теперь можно быстро найти по IDecho $usersById[2]["name"]; // Мария?>```text
### Подсчет элементов
```php<?php$fruits = ["яблоко", "банан", "яблоко", "апельсин", "банан", "яблоко"];
// Подсчет вхождений$counts = array_count_values($fruits);print_r($counts);// ["яблоко" => 3, "банан" => 2, "апельсин" => 1]
// Вручную$counts = [];
foreach ($fruits as $fruit) { if (!isset($counts[$fruit])) { $counts[$fruit] = 0; } $counts[$fruit]++;}?>```text
## WordPress контекст
### Работа с постами
```php<?php// Получение постов$args = [ 'post_type' => 'post', 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'DESC'];
$posts = get_posts($args);
// Извлечение ID постов$post_ids = array_map(function($post) { return $post->ID;}, $posts);
// Фильтрация по категории$category_posts = array_filter($posts, function($post) { return has_category('news', $post);});
// Группировка по автору$by_author = [];
foreach ($posts as $post) { $author_id = $post->post_author;
if (!isset($by_author[$author_id])) { $by_author[$author_id] = []; }
$by_author[$author_id][] = $post;}?>```text
### Meta Query с массивами
```php<?php// Поиск постов с мета-полями$args = [ 'post_type' => 'product', 'meta_query' => [ 'relation' => 'AND', [ 'key' => 'price', 'value' => [100, 500], 'type' => 'NUMERIC', 'compare' => 'BETWEEN' ], [ 'key' => 'in_stock', 'value' => '1', 'compare' => '=' ] ]];
$products = new WP_Query($args);?>```text
### Регистрация таксономий
```php<?phpfunction register_custom_taxonomy() { $args = [ 'labels' => [ 'name' => 'Жанры', 'singular_name' => 'Жанр', 'add_new_item' => 'Добавить жанр' ], 'public' => true, 'hierarchical' => true, 'show_admin_column' => true ];
register_taxonomy('genre', ['book'], $args);}add_action('init', 'register_custom_taxonomy');?>```text
## Практика
### Задание 1: Управление задачами
Создайте массив задач и реализуйте функции:- Добавление задачи- Удаление задачи- Отметка выполненной- Фильтрация (выполненные/невыполненные)
```php<?php$tasks = [];
function addTask(&$tasks, $title) { $tasks[] = [ 'id' => count($tasks) + 1, 'title' => $title, 'completed' => false ];}
function removeTask(&$tasks, $id) { $tasks = array_filter($tasks, function($task) use ($id) { return $task['id'] !== $id; });}
function completeTask(&$tasks, $id) { foreach ($tasks as &$task) { if ($task['id'] === $id) { $task['completed'] = true; break; } }}
// ИспользованиеaddTask($tasks, "Изучить PHP массивы");addTask($tasks, "Создать проект");completeTask($tasks, 1);?>```text
### Задание 2: Корзина покупок
Реализуйте функционал корзины:- Добавление товара- Удаление товара- Изменение количества- Подсчет общей суммы
### Задание 3: Фильтрация товаров
Создайте систему фильтрации товаров по цене, категории, наличию.
### Задание 4: Статистика по данным
Подсчитайте среднее, минимум, максимум, медиану для массива чисел.
### Задание 5: WordPress shortcode со списком
Создайте shortcode, который принимает массив элементов и выводит их списком.
## Онлайн-редакторы
Тестируйте примеры:- **PHPSandbox**: https://phpsandbox.io/- **3v4l**: https://3v4l.org/
## Итоги
В этом уроке вы изучили:
✅ **Типы массивов** — индексированные, ассоциативные, многомерные✅ **Функции работы с массивами** — более 70 встроенных функций✅ **Перебор** — foreach, for, итераторы✅ **Сортировка** — sort, asort, usort✅ **Фильтрация и преобразование** — filter, map, reduce✅ **Практические примеры** — группировка, индексация, подсчет✅ **WordPress массивы** — args, meta_query, таксономии
### Следующий шаг
Переходите к изучению суперглобальных переменных: [Суперглобальные переменные](/php/superglobals/)
### Ключевые моменты
1. **Массивы — основа PHP** — почти везде используются2. **foreach — лучший выбор** — для перебора массивов3. **array_map/filter/reduce** — функциональное программирование4. **Не забывайте unset($var)** — после foreach с &5. **WordPress любит массивы** — args везде
**Совет:** Изучите документацию array_* функций на php.net — их более 70 и они очень мощные!
---
**Готовы двигаться дальше?** Переходите к следующему уроку: [Суперглобальные переменные](/php/superglobals/)