Массивы в PHP: способы и приемы обработки данных

Раздел: PHP -> Массивы

Работа с массивами в PHP: основные подходы

Массивы в PHP являются гибким инструментом для хранения и обработки наборов данных. Для эффективной работы с ними используются встроенные функции и различные конструкции языка. Рассмотрим наиболее продуктивный способ, а также альтернативные варианты с примерами и возможными проблемами.

Каким способом можно обработать массив данных без явного цикла?

Наиболее эффективным решением для преобразования, фильтрации и агрегации массивов является использование функций array_map, array_filter и array_reduce. Эти функции принимают callback и возвращают новый массив или одно значение, что уменьшает объем кода и повышает его читаемость.


// Исходный массив чисел
$numbers = [1, 2, 3, 4, 5];

// Фильтрация: оставить только чётные числа
$even = array_filter($numbers, fn($n) => $n % 2 === 0);

// Преобразование: каждое число умножить на 2
$doubled = array_map(fn($n) => $n * 2, $numbers);

// Агрегация: сумма всех чисел
$sum = array_reduce($numbers, fn($carry, $n) => $carry + $n, 0);
  

Php ключи массива (получение ключей массива в php)

Callback-функции могут быть стрелочными (с PHP 7.4) или обычными. Важно, что array_filter сохраняет ключи, поэтому после фильтрации может потребоваться array_values. При использовании array_map ключи исходного массива не сохраняются (нумеруются заново), если передаётся несколько массивов – поведение меняется.

Типичная ошибка: передача в array_filter callback без возврата булева значения. Любое значение, которое приводится к false (0, null, пустая строка), будет отброшено. Чтобы оставить только явно не пустые элементы, нужно использовать специальный флаг ARRAY_FILTER_USE_BOTH или проверять тип.

Как перебрать массив с помощью цикла foreach?

Цикл foreach является самым простым и наглядным способом последовательно обработать все элементы. Он автоматически работает с ключами и значениями.


$fruits = ['apple', 'banana', 'cherry'];
foreach ($fruits as $index => $fruit) {
    echo "$index: $fruit\n";
}
  

Php массивы индексы (получение индексов массива в php)

Если требуется изменить значения внутри цикла, необходимо использовать ссылку &$fruit. После завершения цикла ссылку стоит удалить с помощью unset, чтобы избежать побочных эффектов.

Проблема: при использовании ссылки в foreach переменная сохраняет последнее значение после цикла, что может привести к неожиданным результатам. Всегда следует обнулять ссылку.

Как добавить и удалить элементы массива?

Для добавления элементов в конец применяется оператор [] = или функция array_push. Удаление элемента по ключу выполняется через unset, удаление первого/последнего элемента – через array_shift / array_pop.


$arr = [1, 2, 3];
$arr[] = 4;
array_push($arr, 5);
unset($arr[0]); // удалить элемент с ключом 0
array_shift($arr); // удалить первый элемент (ключи переиндексируются)
  

массив данных php (работа с массивом данных в php)

Ошибка: после unset ключи не переиндексируются, образуются пропуски. Для сброса нумерации используется array_values. При array_shift все числовые ключи сбрасываются.

Как отсортировать массив с сохранением связей?

Функции sort и rsort сбрасывают ключи. Для сохранения ассоциативных связей применяются asort (сортировка по значениям) и ksort (сортировка по ключам). Для пользовательской логики – usort, uasort, uksort.


$ages = ['Alice' => 30, 'Bob' => 25, 'Charlie' => 35];
asort($ages); // сохраняет имена, сортирует по возрасту
ksort($ages); // сортирует по именам
  

массив ли php (проверка, является ли переменная массивом в php)

Частая проблема: естественная сортировка строк (например, файл1, файл2, файл10) требует natsort или natcasesort. Обычная sort расположит файл10 перед файлом2.

Как выполнить поиск значения в массиве?

in_array проверяет существование значения (возвращает true/false). array_search возвращает ключ первого найденного элемента.


$found = in_array('banana', $fruits);
$key = array_search('cherry', $fruits);
  

Php разбить массив (разбиение массива на части в php)

Проблема с типами: по умолчанию сравнение нестрогое. '1' == 1 – true. Для строгого сравнения передаётся третий параметр true. Если массив содержит null, поиск может дать неожиданные результаты.

Как получить уникальные элементы массива?

array_unique удаляет повторяющиеся значения, сохраняя первые встретившиеся ключи. Однако порядок элементов может измениться – на самом деле он остаётся как в исходном массиве, но ключи не сбрасываются.


$duplicates = [1, 2, 2, 3, 3, 3];
$unique = array_unique($duplicates);
  

Ошибка: array_unique не переиндексирует числовые ключи. Если требуется получить массив с последовательными ключами, нужно дополнительно применить array_values.

- ассоциативный массив php (ассоциативные массивы в php)
- Php удалить массива (удаление всего массива в php)
- функции массива php (функции для работы с массивами в php)

Расширенные примеры обработки массивов в PHP

1. Работа с многомерными массивами и рекурсивный обход

Для обхода всех узлов вложенного массива используется array_walk_recursive. Пример: преобразование всех строк в верхний регистр.

Пример

$nested = [
    'alpha' => ['a', 'b'],
    'beta' => ['c', ['d', 'e']]
];
array_walk_recursive($nested, function (&$value, $key) {
    if (is_string($value)) {
        $value = strtoupper($value);
    }
});
print_r($nested);
Array
(
    [alpha] => Array
        (
            [0] => A
            [1] => B
        )
    [beta] => Array
        (
            [0] => C
            [1] => Array
                (
                    [0] => D
                    [1] => E
                )
        )
)

2. Извлечение столбца из массива объектов или ассоциативных массивов

Функция array_column выбирает значения одного ключа из вложенных массивов. Удобно при работе с результатами запросов БД.

Пример

$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
];
$names = array_column($users, 'name');
print_r($names);
Array
(
    [0] => Alice
    [1] => Bob
)

Третий параметр позволяет использовать один из столбцов в качестве ключей результирующего массива.

Пример

$ids = array_column($users, 'name', 'id');
print_r($ids);
Array
(
    [1] => Alice
    [2] => Bob
)

3. Слияние двух массивов в один ассоциативный (ключи одного – значения другого)

array_combine создаёт массив, где один массив – ключи, второй – значения.

Пример

$keys = ['name', 'age', 'city'];
$values = ['Alice', 30, 'Paris'];
$combined = array_combine($keys, $values);
print_r($combined);
Array
(
    [name] => Alice
    [age] => 30
    [city] => Paris
)

Проблема: если массивы имеют разную длину, будет сгенерирована ошибка. Перед вызовом следует проверить count($keys) === count($values).

4. Разница и пересечение массивов

array_diff возвращает элементы первого массива, которых нет в других. array_intersect – общие элементы.

Пример

$a = [1, 2, 3, 4];
$b = [3, 4, 5, 6];
$diff = array_diff($a, $b);
$intersect = array_intersect($a, $b);
print_r($diff);
print_r($intersect);
Array
(
    [0] => 1
    [1] => 2
)
Array
(
    [2] => 3
    [3] => 4
)

Для работы с ассоциативными массивами существуют array_diff_assoc и array_intersect_assoc, которые сравнивают и ключи, и значения.

5. Применение array_filter с флагами

Чтобы callback получал и ключ, и значение, используется флаг ARRAY_FILTER_USE_BOTH. Пример: оставить элементы, где ключ чётный.

Пример

$data = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
$filtered = array_filter($data, fn($value, $key) => $key % 2 === 0, ARRAY_FILTER_USE_BOTH);
print_r($filtered);
Array
(
    [a] => 1
    [c] => 3
)

Обратите внимание: ключи 'a' и 'c' в числовом контексте преобразуются в 0 и 1? Нет, строковые ключи не участвуют в сравнении. В PHP ключи-строки не приводятся к числу автоматически, поэтому условие будет ложным для строк. Здесь лучше использовать целочисленные ключи.

6. Использование array_reduce для подсчёта статистики

Пример: подсчёт среднего значения арифметического.

Пример

$scores = [78, 85, 92, 88, 73];
$average = array_reduce($scores, fn($carry, $score) => $carry + $score, 0) / count($scores);
echo $average;
83.2

7. Сортировка ассоциативного массива по значениям с помощью пользовательской функции

Пример: сортировка товаров по цене.

Пример

$products = [
    ['name' => 'Pen', 'price' => 1.2],
    ['name' => 'Pencil', 'price' => 0.8],
    ['name' => 'Eraser', 'price' => 0.5],
];

usort($products, fn($a, $b) => $a['price'] <=> $b['price']);
print_r($products);
Array
(
    [0] => Array
        (
            [name] => Eraser
            [price] => 0.5
        )
    [1] => Array
        (
            [name] => Pencil
            [price] => 0.8
        )
    [2] => Array
        (
            [name] => Pen
            [price] => 1.2
        )
)

8. Деструктуризация массива (list или [] с PHP 7.1)

Удобно для присваивания переменным из индексированного массива.

Пример

$info = ['Alice', 30, 'Paris'];
[$name, $age, $city] = $info;
echo "$name is $age years old and lives in $city.";
Alice is 30 years old and lives in Paris.

Также работает с вложенными массивами.

Пример

$matrix = [[1, 2], [3, 4]];
[[$a, $b], [$c, $d]] = $matrix;

Работа с массивом данных в PHP - comments

En
массив данных php (php)