Array_column
Glossary overview

Array_column

array_column() — суперудобная функция в PHP, особенно когда ты работаешь с массивами массивов (например, из базы данных или JSON).

Что делает array_column()

Она вытаскивает один столбец (значения по определённому ключу) из массива массивов.

Простой пример

$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie'],
];

$names = array_column($users, 'name');

print_r($names);

// Вывод

Array
(
    [0] => Alice
    [1] => Bob
    [2] => Charlie
)

С указанием $index_key

$names_by_id = array_column($users, 'name', 'id');

print_r($names_by_id);

// Вывод
Array
(
    [1] => Alice
    [2] => Bob
    [3] => Charlie
)

Теперь ты можешь быстро обратиться к имени по ID:

echo $names_by_id[2]; // Bob

Пример: ищем по ID

$user_ids = array_column($users, 'id');

if (in_array(2, $user_ids)) {
    echo "User with ID 2 exists!";
}

Сортировка массива по колонке с помощью array_column() + array_multisort()

Пример: сортировка пользователей по возрасту

$users = [
    ['id' => 1, 'name' => 'Alice', 'age' => 32],
    ['id' => 2, 'name' => 'Bob', 'age' => 25],
    ['id' => 3, 'name' => 'Charlie', 'age' => 40],
];

// Вытаскиваем колонку с возрастами
$ages = array_column($users, 'age');

// Сортируем $users по $ages
array_multisort($ages, SORT_ASC, $users);

print_r($users);

// Вывод
Array
(
    [0] => Array ( [id] => 2 [name] => Bob [age] => 25 )
    [1] => Array ( [id] => 1 [name] => Alice [age] => 32 )
    [2] => Array ( [id] => 3 [name] => Charlie [age] => 40 )
)

Это очень удобный способ сортировать массив по любой колонке — имя, дата, цена, и т.д.

Группировка по колонке (например, по роли, категории)

array_column() сам по себе не группирует, но помогает подготовить данные. Дальше используем обычный foreach.

Пример: группировка пользователей по роли

$users = [
    ['id' => 1, 'name' => 'Alice', 'role' => 'admin'],
    ['id' => 2, 'name' => 'Bob', 'role' => 'editor'],
    ['id' => 3, 'name' => 'Charlie', 'role' => 'admin'],
    ['id' => 4, 'name' => 'Dave', 'role' => 'viewer'],
];

$grouped = [];

foreach ($users as $user) {
    $grouped[$user['role']][] = $user;
}

print_r($grouped);

// Вывод
Array
(
    [admin] => Array
        (
            [0] => Array ( [id] => 1 [name] => Alice [role] => admin )
            [1] => Array ( [id] => 3 [name] => Charlie [role] => admin )
        )

    [editor] => Array
        (
            [0] => Array ( [id] => 2 [name] => Bob [role] => editor )
        )

    [viewer] => Array
        (
            [0] => Array ( [id] => 4 [name] => Dave [role] => viewer )
        )
)

Пример: Группировка пользователей по role с array_reduce()

$users = [
    ['id' => 1, 'name' => 'Alice', 'role' => 'admin'],
    ['id' => 2, 'name' => 'Bob', 'role' => 'editor'],
    ['id' => 3, 'name' => 'Charlie', 'role' => 'admin'],
    ['id' => 4, 'name' => 'Dave', 'role' => 'viewer'],
];
$grouped = array_reduce($users, function($carry, $user) {
    $carry[$user['role']][] = $user;
    return $carry;
}, []);
// Вывод
Array
(
    [admin] => Array
        (
            [0] => Array ( [id] => 1, [name] => Alice, [role] => admin )
            [1] => Array ( [id] => 3, [name] => Charlie, [role] => admin )
        )

    [editor] => Array
        (
            [0] => Array ( [id] => 2, [name] => Bob, [role] => editor )
        )

    [viewer] => Array
        (
            [0] => Array ( [id] => 4, [name] => Dave, [role] => viewer )
        )
)

А array_column() тут можно использовать для вспомогательных целей

Например, получить список всех ролей:

$roles = array_column($users, 'role');
$unique_roles = array_unique($roles);

print_r($unique_roles);

// Вывод
Array ( [0] => admin [1] => editor [3] => viewer )

Хочешь круче?

Можно написать функцию groupBy() на основе array_reduce() и использовать её где угодно:

function groupBy(array $array, string $key): array {
    return array_reduce($array, function($carry, $item) use ($key) {
        $carry[$item[$key]][] = $item;
        return $carry;
    }, []);
}

// Использование:
$groupedUsers = groupBy($users, 'role');