array_column() extrae todos los valores de una columna concreta de un array multidimensional y, opcionalmente, reindexar el resultado por otra columna. Es la función perfecta para trabajar con los resultados de una consulta PDO sin tener que escribir un foreach manual para extraer IDs o nombres.
Sintaxis
<?php
array_column(
array $array,
int|string|null $column_key,
int|string|null $index_key = null
): array
?>
$column_key es la clave o índice de la columna a extraer. $index_key es la columna que se usará como clave del array resultante. Si $column_key es null, se devuelven todos los elementos reindexados por $index_key.
Extraer una columna de resultados PDO
<?php
// Resultado típico de PDO::fetchAll(PDO::FETCH_ASSOC)
$productos = [
['id' => 1, 'nombre' => 'Camiseta', 'precio' => 19.90, 'stock' => 45],
['id' => 2, 'nombre' => 'Pantalón', 'precio' => 39.90, 'stock' => 12],
['id' => 3, 'nombre' => 'Zapatillas', 'precio' => 89.90, 'stock' => 0],
['id' => 4, 'nombre' => 'Chaqueta', 'precio' => 79.90, 'stock' => 8],
];
// Solo los nombres
$nombres = array_column($productos, 'nombre');
// ['Camiseta', 'Pantalón', 'Zapatillas', 'Chaqueta']
// Solo los IDs
$ids = array_column($productos, 'id');
// [1, 2, 3, 4]
?>
Reindexar por ID para búsquedas O(1)
Pasar el tercer argumento reindexar el array resultante por una columna. Esto convierte una lista en un mapa que permite buscar por ID sin recorrer todo el array:
<?php // Todos los productos indexados por su ID $porId = array_column($productos, null, 'id'); // Acceso directo por ID sin foreach $producto = $porId[3]; echo $producto['nombre']; // Zapatillas // Mapa id ? nombre $mapaIdNombre = array_column($productos, 'nombre', 'id'); // [1 => 'Camiseta', 2 => 'Pantalón', 3 => 'Zapatillas', 4 => 'Chaqueta'] echo $mapaIdNombre[2]; // Pantalón ?>
Trabajar con objetos
array_column() también funciona con arrays de objetos, accediendo a las propiedades públicas por nombre:
<?php
class Categoria {
public function __construct(
public int $id,
public string $nombre,
public bool $activa
) {}
}
$categorias = [
new Categoria(10, 'Ropa', true),
new Categoria(11, 'Calzado', true),
new Categoria(12, 'Accesorios', false),
];
$nombres = array_column($categorias, 'nombre');
// ['Ropa', 'Calzado', 'Accesorios']
$activas = array_column(
array_filter($categorias, fn($c) => $c->activa),
'nombre',
'id'
);
// [10 => 'Ropa', 11 => 'Calzado']
?>
Combinar con array_unique y array_multisort
<?php
$pedidos = [
['id' => 1, 'estado' => 'enviado', 'cliente_id' => 42],
['id' => 2, 'estado' => 'pendiente', 'cliente_id' => 15],
['id' => 3, 'estado' => 'enviado', 'cliente_id' => 42],
['id' => 4, 'estado' => 'entregado', 'cliente_id' => 30],
];
// Clientes únicos con pedidos
$clientesConPedidos = array_unique(array_column($pedidos, 'cliente_id'));
// [42, 15, 30]
// Ordenar por precio usando array_column + array_multisort
$precios = array_column($productos, 'precio');
array_multisort($precios, SORT_ASC, $productos);
// $productos ahora ordenado por precio ascendente
?>
La documentación oficial de array_column() detalla el comportamiento con objetos y los cambios introducidos en PHP 7.0 que permiten usar null como clave de columna.
