Перейти к содержимому

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" => "Иван",
"email" => "[email protected]",
"age" => 25,
"city" => "Москва"
];
// Доступ к элементам
echo $user["name"]; // Иван
echo $user["email"]; // [email protected]
// Изменение значения
$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"]; // 30
echo $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];
$user2 = ["email" => "[email protected]", "city" => "Москва"];
$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 элемента с индекса 1
print_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, end
reset($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" => 1, "name" => "Иван", "email" => "[email protected]"],
["id" => 2, "name" => "Мария", "email" => "[email protected]"],
["id" => 3, "name" => "Петр", "email" => "[email protected]"]
];
// Индексация по ID
$usersById = [];
foreach ($users as $user) {
$usersById[$user["id"]] = $user;
}
// Теперь можно быстро найти по ID
echo $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
<?php
function 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/)