PHP. Is it possible to use array_column with an array of objects

Solution 1:

PHP 5

array_column doesn't work with an array of objects. Use array_map instead:

$titles = array_map(function($e) {
    return is_object($e) ? $e->Title : $e['Title'];
}, $records);

PHP 7

array_column()

The function now supports an array of objects as well as two-dimensional arrays. Only public properties are considered, and objects that make use of __get() for dynamic properties must also implement __isset().

See https://github.com/php/php-src/blob/PHP-7.0.0/UPGRADING#L629 - Thanks to Bell for the hint!

Solution 2:

Is it possible to pass in array_column an array of objects?

PHP 7

Yes, see http://php.net/manual/en/function.array-column.php

PHP 5 >= 5.5.0

In PHP 5 array_column does not work with an array of objects. You can try with:

// object 1
$a = new stdClass();
$a->my_string = 'ciao';
$a->my_number = 10;

// object 2
$b = new stdClass();
$b->my_string = 'ciao b';
$b->my_number = 100;

// array of objects
$arr_o = array($a,$b);

// using array_column with an array of objects
$result = array_column(array_map(function($o){return (array)$o;},$arr_o),'my_string');

PS: for clarity I prefer to not use array_column and use array_map with an anonymous function

$result = array_map(function($o){ return $o->my_string; }, $arr_o);

or a simple foreach

$result = array();
foreach($arr_o as $o) {
    $result[] = $o->my_string;
}

Solution 3:

Here is a function that will work on both php7 and php5

function array_column_portable($array, $key) {
    return array_map(function($e) use ($key) {
        return is_object($e) ? $e->$key : $e[$key];
    }, $array);
}

You can then use it as you use array_column in php7