19-го марта было объявлено о «feature freeze» в ветке PHP 5.5, в преддверии выхода php-5.5.0beta1. В числе других, в эту версию включена новая функция для работы с массивами под названием array_column.
Упоминание об этой функции промелькнуло на Хабре прошлым летом, но тогда она имела статус proposed, теперь же она, определенно, войдет в PHP 5.5.
Как работает array_column
Формат вызова:
(array) array_column(array $input, mixed $columnKey[, mixed $indexKey]);
Здесь $input — исходный [N>1]-мерный массив, из которого производится выборка, а $columnKey — индекс столбца, по которому она делается. Если будет указан параметр $indexKey, результат будет дополнительно проиндексирован по указанному в нем столбцу.
Пример №1
Допустим, у нас есть массив:
<?php
$records = array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe'
),
array(
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith'
),
array(
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Jones'
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe'
)
);
$firstNames = array_column($records, 'first_name');
print_r($firstNames);
Получим выборку по столбцу first_name:
Array
(
[0] => John
[1] => Sally
[2] => Jane
[3] => Peter
)
Пример №2
Теперь дополнительно проиндексируем тот же массив по столбцу id:
<?php
$lastNames = array_column($records, 'last_name', 'id');
print_r($lastNames);
Получаем массив вида id => last_name:
Array
(
[2135] => Doe
[3245] => Smith
[5342] => Jones
[5623] => Doe
)
Но что если «строки» не всегда имеют один и тот же набор ключей?
<?php
$mismatchedColumns = array(
array(
'a' => 'foo',
'b' => 'bar',
'e' => 'baz'
),
array(
'a' => 'qux',
'c' => 'quux',
'd' => 'corge'
),
array(
'a' => 'grault',
'b' => 'garply',
'e' => 'waldo'
),
);
Здесь во всех строках есть ключ "a", но ключ "b" есть только в двух из них. В этом случае все элементы columnKey будут возвращены, а если в соответствующей строчке отсутствует ключ indexKey, они будут пронумерованы целыми числами, начиная с нуля. Примерно так, как если бы при объявлении массива мы случайно забыли указать индекс.
<?php
$foo = array_column($mismatchedColumns, 'a', 'b');
$bar = array('bar' => 'foo', 'qux', 'garply' => 'grault');
/*
$foo и $bar содержат примерно следующее:
Array
(
[bar] => foo
[0] => qux
[garply] => grault
)
*/
Если же вы захотите сделать выборку по ключу "b", то получите массив с двумя элементами, так как только две строки содержат этот индекс.
В случае, если более чем одна строка содержит одно и то же значение indexKey, новое значение перезапишет то, которое встретилось ранее.
// Массив $records из примера №1
$firstNames = array_column($records, 'first_name', 'last_name');
print_r($firstNames);
/*
Array
(
[Doe] => Peter
[Smith] => Sally
[Jones] => Jane
)
*/
Автор: seniorkrok