Array column: примеры (PHP)
array_column(array $array, int|string|null $column_key, int|string|null $index_key = null): arrayФункция array_column
Функция array_column извлекает значения из одного столбца многомерного массива или массива объектов. Она используется для упрощения операций, когда необходимо получить все данные по определенному ключу из набора записей.
Функция принимает до четырех аргументов:
- array (обязательный) - Входной многомерный массив (массив массивов) или массив объектов.
- column_key (обязательный) - Ключ столбца, значения которого нужно извлечь. Может быть строкой (имя ключа), целым числом (индекс) или
null(для возврата целых строк или объектов). - index_key (необязательный) - Ключ столбца, значения которого будут использоваться в качестве ключей возвращаемого массива.
- 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] => Мария
)<?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] => Мария
)<?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
Функция применяет callback-функцию ко всем элементам массива. Может использоваться для извлечения столбца, но синтаксис сложнее.
$names = array_map(fn($user) => $user['name'], $users);Прямой перебор массива для сбора значений. Требует больше кода, но дает полный контроль над процессом.
$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 более поздние элементы перезаписывают предыдущие.
<?php
$users = [
['id' => 1, 'name' => 'Алексей'],
['id' => 1, 'name' => 'Дмитрий']
];
$result = array_column($users, 'name', 'id');
print_r($result);
?>Array
(
[1] => Дмитрий
)Изменения в новых версиях PHP
Добавлена поддержка извлечения свойств из объектов с помощью public свойств. Работа с приватными свойствами объектов по-прежнему невозможна.
Функция научилась работать с массивом объектов, извлекая значения публичных свойств. В более ранних версиях поддерживались только массивы.
Расширенные примеры
<?php
$products = [
['sku' => 'A100', 'name' => 'Клавиатура', 'price' => 2500],
['sku' => 'A200', 'name' => 'Мышь', 'price' => 1200]
];
$priceList = array_column($products, 'price', 'sku');
// Быстрый доступ к цене по sku
echo $priceList['A100'];
?>2500
Создание ассоциативного массива, где ключи и значения взяты из разных столбцов.
<?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
$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
)<?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
)
)Аналоги в других языках
Используется 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))['Алексей', 'Мария']
Применяется метод map для массивов.
const users = [
{id: 1, name: 'Алексей'},
{id: 2, name: 'Мария'}
];
const names = users.map(user => user.name);['Алексей', 'Мария']
В SQL столбец извлекается непосредственно в запросе SELECT.
SELECT name FROM users;Основное отличие: в PHP функция работает с уже полученными массивами данных, тогда в SQL извлечение происходит на уровне базы данных.