Типы массивов: индексированные, ассоциативные, многомерные
Виды массивов в PHP
Какие существуют виды массивов в PHP и как их создавать?
В PHP массивы делятся на три основных типа: индексированные, ассоциативные и многомерные. Индексированные массивы используют числовые ключи по порядку. Ассоциативные массивы используют строковые или смешанные ключи. Многомерные массивы содержат другие массивы в качестве элементов.
Пример индексированного массива
<?php
$arr = ['яблоко', 'банан', 'вишня'];
echo $arr[0]; // яблоко
виды массивов php (виды массивов в php)
Пример ассоциативного массива
<?php
$person = ['name' => 'Иван', 'age' => 25];
echo $person['name']; // Иван
Пример многомерного массива
<?php
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
echo $matrix[1][2]; // 6
Типичная ошибка: попытка обратиться к несуществующему ключу. Возникает предупреждение E_WARNING. Решение: проверять ключи с помощью array_key_exists() или isset().
Проблема: путаница между индексированными и ассоциативными массивами при использовании функций сортировки. Например, sort() сбрасывает ключи. Рекомендуется использовать asort() для ассоциативных массивов.
Основной способ создания массива в PHP - использование квадратных скобок [] или функции array(). Для большинства задач короткий синтаксис считается более эффективным и читаемым.
Как создать массив с фиксированным количеством элементов, заполненный одинаковыми значениями?
Использование функции array_fill() позволяет создать массив с заданным количеством элементов и одинаковым значением.
<?php
$arr = array_fill(0, 5, 'PHP');
print_r($arr);
// Array ( [0] => PHP [1] => PHP [2] => PHP [3] => PHP [4] => PHP )
Ошибка: если передать отрицательное количество элементов, будет выброшено исключение. Необходимо проверять число.
Как создать ассоциативный массив, объединив два списка ключей и значений?
Функция array_combine() создаёт ассоциативный массив, используя один массив как ключи, а другой как значения.
<?php
$keys = ['id', 'name', 'email'];
$values = [1, 'Мария', 'maria@example.com'];
$user = array_combine($keys, $values);
print_r($user);
// Array ( [id] => 1 [name] => Мария [email] => maria@example.com )
Если количество ключей и значений не совпадает, функция возвращает false и генерирует предупреждение. Перед использованием стоит проверять длину массивов.
Как создать массив чисел или символов в заданном диапазоне?
Функция range() создаёт массив, содержащий последовательность чисел или символов.
<?php
$numbers = range(1, 10, 2); // с шагом 2
print_r($numbers);
// Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 )
$letters = range('a', 'f');
print_r($letters);
// Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f )
При использовании очень больших диапазонов память может переполниться. Для генерации последовательностей большого размера лучше использовать генераторы или цикл.
Как создать массив с фиксированной памятью для повышения производительности?
Класс SplFixedArray предоставляет массив с фиксированным размером, что уменьшает накладные расходы на память. Он подходит для больших наборов данных, где количество элементов известно заранее.
<?php
$fixed = new SplFixedArray(3);
$fixed[0] = 'A';
$fixed[1] = 'B';
$fixed[2] = 'C';
echo $fixed[1]; // B
// Попытка выйти за границы вызовет исключение
Нельзя добавить элемент за пределами объявленного размера, иначе - RuntimeException. Это ограничение может быть неудобно для динамических данных.
Как быстро создать ассоциативный массив из переменных с именами ключей?
Функция compact() создаёт массив из существующих переменных, используя их имена как ключи.
<?php
$name = 'Пётр';
$age = 30;
$city = 'Москва';
$data = compact('name', 'age', 'city');
print_r($data);
// Array ( [name] => Пётр [age] => 30 [city] => Москва )
Функция игнорирует несуществующие переменные; ошибок не возникает, но результат может быть неполным. Решение: проверять наличие переменных перед вызовом.
Расширенные примеры работы с массивами
Обход многомерного массива с помощью рекурсивной функции
<?php
function printArray($arr, $indent = 0) {
foreach ($arr as $key => $value) {
echo str_repeat(' ', $indent) . $key . ': ';
if (is_array($value)) {
echo chr(10);
printArray($value, $indent + 4);
} else {
echo $value . chr(10);
}
}
}
$data = [
'users' => [
['name' => 'Анна', 'age' => 28],
['name' => 'Борис', 'age' => 35]
],
'settings' => ['theme' => 'dark', 'lang' => 'ru']
];
printArray($data);
?>
users:
name: Анна
age: 28
name: Борис
age: 35
settings:
theme: dark
lang: ru
Использование array_map с анонимной функцией для преобразования элементов
<?php
$numbers = [1, 2, 3, 4, 5];
$squared = array_map(function($n) { return $n * $n; }, $numbers);
print_r($squared);
// Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
Сортировка ассоциативного массива по значениям с сохранением ключей (asort)
<?php
$ages = ['Иван' => 30, 'Мария' => 25, 'Алексей' => 28];
asort($ages);
print_r($ages);
// Array ( [Мария] => 25 [Алексей] => 28 [Иван] => 30 )
Array ( [Мария] => 25 [Алексей] => 28 [Иван] => 30 )
Фильтрация массива с помощью array_filter
<?php
$numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
$even = array_filter($numbers, function($n) { return $n % 2 === 0; });
print_r($even);
// Array ( [0] => 0 [2] => 2 [4] => 4 [6] => 6 [8] => 8 )
Array ( [0] => 0 [2] => 2 [4] => 4 [6] => 6 [8] => 8 )
Вычисление суммы через array_reduce
<?php
$prices = [100, 250, 300, 150];
$total = array_reduce($prices, function($carry, $item) { return $carry + $item; }, 0);
echo 'Итого: ' . $total; // Итого: 800
Итого: 800
Пересечение и разность массивов
<?php
$arr1 = [1, 2, 3, 4, 5];
$arr2 = [3, 4, 5, 6, 7];
$intersect = array_intersect($arr1, $arr2);
$diff = array_diff($arr1, $arr2);
print_r($intersect); // [3,4,5]
print_r($diff); // [1,2]
Array ( [2] => 3 [3] => 4 [4] => 5 ) Array ( [0] => 1 [1] => 2 )
Рекурсивный обход с array_walk_recursive
<?php
$nested = ['a' => ['b' => 1, 'c' => 2], 'd' => 3];
$result = [];
array_walk_recursive($nested, function($value, $key) use (&$result) {
$result[] = $key . '=' . $value;
});
print_r($result);
// Array ( [0] => b=1 [1] => c=2 [2] => d=3 )
Array ( [0] => b=1 [1] => c=2 [2] => d=3 )