Array column: примеры (PHP)

Извлечение столбцов из массивов с помощью array_column
Раздел: Работа с массивами
array_column(array $array, int|string|null $column_key, int|string|null $index_key = null): array

Функция array_column

Назначение

Функция array_column извлекает значения из одного столбца многомерного массива или массива объектов. Она используется для упрощения операций, когда необходимо получить все данные по определенному ключу из набора записей.

Аргументы функции

Функция принимает до четырех аргументов:

  1. array (обязательный) - Входной многомерный массив (массив массивов) или массив объектов.
  2. column_key (обязательный) - Ключ столбца, значения которого нужно извлечь. Может быть строкой (имя ключа), целым числом (индекс) или null (для возврата целых строк или объектов).
  3. index_key (необязательный) - Ключ столбца, значения которого будут использоваться в качестве ключей возвращаемого массива.
  4. flags (необязательный) - Флаг для определения поведения при работе с объектами. Возможные значения: ARRAY_FILTER_USE_KEY (не применяется напрямую к array_column в стандартном использовании, оставлен для будущей совместимости) и комбинация с другими константами не требуется для базовой работы.

Примеры использования

Извлечение значений столбца
<?php
$users = [
    ['id' => 1, 'name' => 'Алексей', 'email' => 'alex@example.com'],
    ['id' => 2, 'name' => 'Мария', 'email' => 'maria@example.com']
];
$names = array_column($users, 'name');
print_r($names);
?>
Array
(
    [0] => Алексей
    [1] => Мария
)
Использование index_key
<?php
$users = [
    ['id' => 15, 'name' => 'Алексей'],
    ['id' => 24, 'name' => 'Мария']
];
$result = array_column($users, 'name', 'id');
print_r($result);
?>
Array
(
    [15] => Алексей
    [24] => Мария
)
Работа с массивом объектов
<?php
class User {
    public function __construct(public $id, public $name) {}
}
$users = [new User(1, 'Алексей'), new User(2, 'Мария')];
$names = array_column($users, 'name');
print_r($names);
?>
Array
(
    [0] => Алексей
    [1] => Мария
)
Использование null в качестве column_key
<?php
$users = [
    ['id' => 1, 'name' => 'Алексей'],
    ['id' => 2, 'name' => 'Мария']
];
$result = array_column($users, null, 'id');
print_r($result);
?>
Array
(
    [1] => Array
        (
            [id] => 1
            [name] => Алексей
        )
    [2] => Array
        (
            [id] => 2
            [name] => Мария
        )
)

Похожие функции в PHP

array_map

Функция применяет callback-функцию ко всем элементам массива. Может использоваться для извлечения столбца, но синтаксис сложнее.

$names = array_map(fn($user) => $user['name'], $users);
Цикл foreach

Прямой перебор массива для сбора значений. Требует больше кода, но дает полный контроль над процессом.

$names = [];
foreach ($users as $user) {
    $names[] = $user['name'];
}

Функция array_column предпочтительнее для простого извлечения столбца, так как она лаконична и оптимизирована. array_map подходит для более сложных преобразований. Цикл используется в нестандартных сценариях.

Типичные ошибки

Отсутствующий ключ в элементах массива

Если ключ column_key отсутствует в некоторых элементах, функция вернет null для этих позиций.

<?php
$data = [
    ['name' => 'Алексей'],
    ['title' => 'Главный']
];
$result = array_column($data, 'name');
print_r($result);
?>
Array
(
    [0] => Алексей
    [1] => 
)
Некорректный тип входных данных

Передача простого массива вместо многомерного вызовет ошибку.

<?php
$simple = [1, 2, 3];
$result = array_column($simple, 0);
?>
Warning: array_column() expects parameter 1 to be array, int given
Использование index_key с дублирующимися значениями

При совпадении значений index_key более поздние элементы перезаписывают предыдущие.

<?php
$users = [
    ['id' => 1, 'name' => 'Алексей'],
    ['id' => 1, 'name' => 'Дмитрий']
];
$result = array_column($users, 'name', 'id');
print_r($result);
?>
Array
(
    [1] => Дмитрий
)

Изменения в новых версиях PHP

PHP 8.0

Добавлена поддержка извлечения свойств из объектов с помощью public свойств. Работа с приватными свойствами объектов по-прежнему невозможна.

PHP 7.0

Функция научилась работать с массивом объектов, извлекая значения публичных свойств. В более ранних версиях поддерживались только массивы.

Расширенные примеры

Создание ассоциативного массива для быстрого поиска
Пример php
<?php
$products = [
    ['sku' => 'A100', 'name' => 'Клавиатура', 'price' => 2500],
    ['sku' => 'A200', 'name' => 'Мышь', 'price' => 1200]
];
$priceList = array_column($products, 'price', 'sku');
// Быстрый доступ к цене по sku
echo $priceList['A100'];
?>
2500
Комбинация с array_combine

Создание ассоциативного массива, где ключи и значения взяты из разных столбцов.

Пример php
<?php
$data = [
    ['id' => 5, 'code' => 'admin'],
    ['id' => 8, 'code' => 'manager']
];
$result = array_combine(
    array_column($data, 'code'),
    array_column($data, 'id')
);
print_r($result);
?>
Array
(
    [admin] => 5
    [manager] => 8
)
Извлечение данных из вложенных массивов

Функция не поддерживает точечную нотацию для вложенных ключей. Требуется предварительная обработка.

Пример php
<?php
$users = [
    ['name' => 'Алексей', 'contact' => ['email' => 'alex@example.com']],
    ['name' => 'Мария', 'contact' => ['email' => 'maria@example.com']]
];
$emails = array_map(fn($u) => $u['contact']['email'], $users);
// array_column($users, 'contact.email') - не сработает
print_r($emails);
?>
Array
(
    [0] => alex@example.com
    [1] => maria@example.com
)
Использование с array_multisort для сортировки
Пример php
<?php
$users = [
    ['name' => 'Мария', 'age' => 28],
    ['name' => 'Алексей', 'age' => 32],
    ['name' => 'Иван', 'age' => 25]
];
$ages = array_column($users, 'age');
array_multisort($ages, SORT_ASC, $users);
print_r($users);
?>
Array
(
    [0] => Array
        (
            [name] => Иван
            [age] => 25
        )
    [1] => Array
        (
            [name] => Мария
            [age] => 28
        )
    [2] => Array
        (
            [name] => Алексей
            [age] => 32
        )
)

Аналоги в других языках

Python

Используется list comprehension или функция operator.itemgetter.

users = [{'id': 1, 'name': 'Алексей'}, {'id': 2, 'name': 'Мария'}]
names = [user['name'] for user in users]
# Или
from operator import itemgetter
names = list(map(itemgetter('name'), users))
['Алексей', 'Мария']
JavaScript

Применяется метод map для массивов.

const users = [
  {id: 1, name: 'Алексей'},
  {id: 2, name: 'Мария'}
];
const names = users.map(user => user.name);
['Алексей', 'Мария']
MySQL

В SQL столбец извлекается непосредственно в запросе SELECT.

SELECT name FROM users;

Основное отличие: в PHP функция работает с уже полученными массивами данных, тогда в SQL извлечение происходит на уровне базы данных.

PHP array_column function comments

En
Array column Return the values from a single column in the input array