Pull to refresh

В PHP 5.5 будет функция array_column

Reading time2 min
Views25K
19-го марта было объявлено о «feature freeze» в ветке PHP 5.5, в преддверии выхода 21-го марта 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
)
*/
Tags:
Hubs:
+34
Comments49

Articles