array_column

(PHP 5 >= 5.5.0, PHP 7)

array_column入力配列から単一のカラムの値を返す

説明

array array_column ( array $input , mixed $column_key [, mixed $index_key = null ] )

array_column() は、 配列 input の中から column_key で指定した単一のカラムの値を返します。 オプションで index_key も指定できます。これを指定すると、 入力配列内のカラム index_key の値に基づいて結果を並べ替えます。

パラメータ

input

値を取り出したい多次元配列 (あるいはオブジェクトの配列)。 オブジェクトの配列を指定した場合は、public プロパティはそのまま取得できます。 protected や private なプロパティを取得したい場合は、そのクラスがマジックメソッド __get() および __isset() を実装している必要があります。

column_key

値を返したいカラム。 取得したいカラムの番号を整数値で指定することもできるし、 連想配列のキーやプロパティの名前を指定することもできます。 NULL を指定すると、配列やオブジェクト全体を返します (index_key との組み合わせで、配列の並べ替えをするときに便利です)。

index_key

返す配列のインデックスとして使うカラム。 カラム番号を表す整数値、あるいはキーの名前を表す文字列になります。

返り値

入力配列の単一のカラムを表す値の配列を返します。

変更履歴

バージョン 説明
7.0.0 input にオブジェクトの配列を渡せるようになりました。

例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',
    )
);
 
$first_names array_column($records'first_name');
print_r($first_names);
?>

上の例の出力は以下となります。

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

例2 レコードセットから姓を取得し、"id"で並べ替える例

<?php
// 先ほどの例と同じ $records 配列を使います
$last_names array_column($records'last_name''id');
print_r($last_names);
?>

上の例の出力は以下となります。

Array
(
    [2135] => Doe
    [3245] => Smith
    [5342] => Jones
    [5623] => Doe
)

例3 オブジェクトの public プロパティ "username" からユーザー名を取得する例

<?php

class User
{
    public 
$username;

    public function 
__construct(string $username)
    {
        
$this->username $username;
    }
}

$users = [
    new 
User('user 1'),
    new 
User('user 2'),
    new 
User('user 3'),
];

print_r(array_column($users'username'));
?>

上の例の出力は以下となります。

Array
(
    [0] => user 1
    [1] => user 2
    [2] => user 3
)

例4 オブジェクトの private プロパティ "name" から、マジックメソッド __get() を使って名前を取得する例

<?php

class Person
{
    private 
$name;

    public function 
__construct(string $name)
    {
        
$this->name $name;
    }

    public function 
__get($prop)
    {
        return 
$this->$prop;
    }

    public function 
__isset($prop) : bool
    
{
        return isset(
$this->$prop);
    }
}

$people = [
    new 
Person('Fred'),
    new 
Person('Jane'),
    new 
Person('John'),
];

print_r(array_column($people'name'));
?>

上の例の出力は以下となります。

Array
(
    [0] => Fred
    [1] => Jane
    [2] => John
)
__isset() が用意されていなければ、空の配列が返されます。

add a note add a note

User Contributed Notes 19 notes

up
63
mohanrajnr at gmail dot com
1 year ago
if array_column does not exist the below solution will work.

if(!function_exists("array_column"))
{

    function array_column($array,$column_name)
    {

        return array_map(function($element) use($column_name){return $element[$column_name];}, $array);

    }

}
up
50
WARrior
3 years ago
You can also use array_map fucntion if you haven't array_column().

example:

$a = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    )
);

array_column($a, 'last_name');

becomes

array_map(function($element){return $element['last_name'];}, $a);
up
5
kaspar dot wilbuer at web dot de
1 year ago
If you need to extract more than one column from an array, you can use array_intersect_key on each element, like so:

function array_column_multi(array $input, array $column_keys) {
    $result = array();
    $column_keys = array_flip($column_keys);
    foreach($input as $key => $el) {
        $result[$key] = array_intersect_key($el, $column_keys);
    }
    return $result;
}
up
13
till at etill dot net
1 year ago
Some remarks not included in the official documentation.

1) array_column does not support 1D arrays, in which case an empty array is returned.

2) The $column_key is zero-based.

3) If $column_key extends the valid index range an empty array is returned.
up
1
nino at recgr dot com
6 months ago
array_column implementation that works on multidimensional arrays (not just 2-dimensional):

<?php
function array_column_recursive(array $haystack, $needle) {
   
$found = [];
   
array_walk_recursive($haystack, function($value, $key) use (&$found, $needle) {
        if (
$key == $needle)
           
$found[] = $value;
    });
    return
$found;
}

Taken from https://github.com/NinoSkopac/array_column_recursive
up
1
miguelfzarth at gmail dot com
7 months ago
<?php
# for PHP < 5.5
# AND it works with arrayObject AND array of objects

if (!function_exists('array_column')) {
    function
array_column($array, $columnKey, $indexKey = null)
    {
       
$result = array();
        foreach (
$array as $subArray) {
            if (
is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
               
$result[] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
            } elseif (
array_key_exists($indexKey, $subArray)) {
                if (
is_null($columnKey)) {
                   
$index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                   
$result[$index] = $subArray;
                } elseif (
array_key_exists($columnKey, $subArray)) {
                   
$index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                   
$result[$index] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
                }
            }
        }
        return
$result;
    }
}
?>
up
5
Anonymous
1 year ago
I added a little more functionality to the more popular answers here to support the $index_key parameter for PHP < 5.5

<?php
// for php < 5.5
if (!function_exists('array_column')) {
    function
array_column($input, $column_key, $index_key = null) {
       
$arr = array_map(function($d) use ($column_key, $index_key) {
            if (!isset(
$d[$column_key])) {
                return
null;
            }
            if (
$index_key !== null) {
                return array(
$d[$index_key] => $d[$column_key]);
            }
            return
$d[$column_key];
        },
$input);

        if (
$index_key !== null) {
           
$tmp = array();
            foreach (
$arr as $ar) {
               
$tmp[key($ar)] = current($ar);
            }
           
$arr = $tmp;
        }
        return
$arr;
    }
}
?>
up
2
Nolan chou
1 year ago
if (!function_exists('array_column'))
{
    function array_column($input, $column_key=null, $index_key=null)
    {
        $result = array();
        $i = 0;
        foreach ($input as $v)
        {
            $k = $index_key === null || !isset($v[$index_key]) ? $i++ : $v[$index_key];
            $result[$k] = $column_key === null ? $v : (isset($v[$column_key]) ? $v[$column_key] : null);
        }
        return $result;
    }
}
up
3
antonfedonjuk at gmail dot com
1 year ago
My version is closer to the original than http://github.com/ramsey/array_column
<?php
/**
* Provides functionality for array_column() to projects using PHP earlier than
* version 5.5.
* @copyright (c) 2015 WinterSilence (http://github.com/WinterSilence)
* @license MIT
*/
if (!function_exists('array_column')) {
   
/**
     * Returns an array of values representing a single column from the input
     * array.
     * @param array $array A multi-dimensional array from which to pull a
     *     column of values.
     * @param mixed $columnKey The column of values to return. This value may
     *     be the integer key of the column you wish to retrieve, or it may be
     *     the string key name for an associative array. It may also be NULL to
     *     return complete arrays (useful together with index_key to reindex
     *     the array).
     * @param mixed $indexKey The column to use as the index/keys for the
     *     returned array. This value may be the integer key of the column, or
     *     it may be the string key name.
     * @return array
     */
   
function array_column(array $array, $columnKey, $indexKey = null)
    {
       
$result = array();
        foreach (
$array as $subArray) {
            if (!
is_array($subArray)) {
                continue;
            } elseif (
is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
               
$result[] = $subArray[$columnKey];
            } elseif (
array_key_exists($indexKey, $subArray)) {
                if (
is_null($columnKey)) {
                   
$result[$subArray[$indexKey]] = $subArray;
                } elseif (
array_key_exists($columnKey, $subArray)) {
                   
$result[$subArray[$indexKey]] = $subArray[$columnKey];
                }
            }
        }
        return
$result;
    }
}
?>
up
0
Carlos Granados
5 months ago
Here's a neat little snippet for filtering a set of records based on a the value of a column:

<?php

function dictionaryFilterList(array $source, array $data, string $column) : array
{
   
$new     = array_column($data, $column);
   
$keep     = array_diff($new, $source);

    return
array_intersect_key($data, $keep);
}

// Usage:

$users = [
    [
'first_name' => 'Jed', 'last_name' => 'Lopez'],
    [
'first_name' => 'Carlos', 'last_name' => 'Granados'],
    [
'first_name' => 'Dirty', 'last_name' => 'Diana'],
    [
'first_name' => 'John', 'last_name' => 'Williams'],
    [
'first_name' => 'Betty', 'last_name' => 'Boop'],
    [
'first_name' => 'Dan', 'last_name' => 'Daniels'],
    [
'first_name' => 'Britt', 'last_name' => 'Anderson'],
    [
'first_name' => 'Will', 'last_name' => 'Smith'],
    [
'first_name' => 'Magic', 'last_name' => 'Johnson'],
];

var_dump(dictionaryFilterList(['Dirty', 'Dan'], $users, 'first_name'));

// Outputs:
[
    [
'first_name' => 'Jed', 'last_name' => 'Lopez'],
    [
'first_name' => 'Carlos', 'last_name' => 'Granados'],
    [
'first_name' => 'John', 'last_name' => 'Williams'],
    [
'first_name' => 'Betty', 'last_name' => 'Boop'],
    [
'first_name' => 'Britt', 'last_name' => 'Anderson'],
    [
'first_name' => 'Will', 'last_name' => 'Smith'],
    [
'first_name' => 'Magic', 'last_name' => 'Johnson']
]

?>
up
0
benjam
1 year ago
Note that this function will return the last entry when possible keys are duplicated.

<?php

$array
= array(
    array(
       
'1-1',
       
'one',
       
'one',
    ),
    array(
       
'1-2',
       
'two',
       
'one',
    ),
);

var_dump(array_column($array, $value = 0, $index = 1));
var_dump(array_column($array, $value = 0, $index = 2));

// returns:
/*

array (size=2)
  'one' => string '1-1' (length=3)
  'two' => string '1-2' (length=3)

array (size=1)
  'one' => string '1-2' (length=3)

*/
?>
up
-1
greensea
8 months ago
<?php
if (!function_exists('array_column')) {
    function
array_column($input, $column_key, $index_key = NULL) {
        if (!
is_array($input)) {
           
trigger_error(__FUNCTION__ . '() expects parameter 1 to be array, ' . gettype($input) . ' given', E_USER_WARNING);
            return
FALSE;
        }
       
       
$ret = array();
        foreach (
$input as $k => $v) {       
           
$value = NULL;
            if (
$column_key === NULL) {
               
$value = $v;
            }
            else {
               
$value = $v[$column_key];
            }
           
            if (
$index_key === NULL || !isset($v[$index_key])) {
               
$ret[] = $value;
            }
            else {
               
$ret[$v[$index_key]] = $value;
            }  
        }
       
        return
$ret;
    }
}
?>
up
-5
kiler129 @ nowhere
2 years ago
Please note this function accepts 2D-arrays ONLY, and silently returns empty array when non-array argument is provided.

Code:
class testObject {
    public $a = 123;
}
$testArray = [new testObject(), new testObject(), new testObject()];
$result = array_column($testArray, 'a')); //array(0) { }
up
-3
marianbucur17 at yahoo dot com
1 year ago
If array_column is not available you can use the following function, which also has the $index_key parameter:

if (!function_exists('array_column')) {
    function array_column($array, $column_key, $index_key = null)
    {
        return array_reduce($array, function ($result, $item) use ($column_key, $index_key)
        {
            if (null === $index_key) {
                $result[] = $item[$column_key];
            } else {
                $result[$item[$index_key]] = $item[$column_key];
            }

            return $result;
        }, []);
    }
}
up
-4
hypxm at qq dot com
2 years ago
a simple solution:

function arrayColumn(array $array, $column_key, $index_key=null){
        if(function_exists('array_column ')){
            return array_column($array, $column_key, $index_key);
        }
        $result = [];
        foreach($array as $arr){
            if(!is_array($arr)) continue;

            if(is_null($column_key)){
                $value = $arr;
            }else{
                $value = $arr[$column_key];
            }

            if(!is_null($index_key)){
                $key = $arr[$index_key];
                $result[$key] = $value;
            }else{
                $result[] = $value;
            }

        }

        return $result;
    }
up
-1
katrinaelaine6 at gmail dot com
1 month ago
array_column() will return duplicate values.

Instead of having to use array_unique(), use the $index_key as a hack.

**Caution: This may get messy when setting the $column_key and/or $index_key as integers.**

<?php

$records
= [
        [
'id' => 2135, 'first_name' => 'John' ],
    [
'id' => 3245, 'first_name' => 'Sally' ],
    [
'id' => 5342, 'first_name' => 'Jane' ],
    [
'id' => 5623, 'first_name' => 'Peter' ],
        [
'id' => 6982, 'first_name' => 'Sally' ]
];

print_r(array_unique(array_column($records, 'first_name')));

// Force uniqueness by making the key the value.
print_r(array_column($records, 'first_name', 'first_name'));
print_r(array_column($records, 'id', 'first_name'));

// Returns
/*

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

Array
(
    [John] => John
    [Sally] => Sally
    [Jane] => Jane
    [Peter] => Peter
)

Array
(
    [John] => 2135
    [Sally] => 6982
    [Jane] => 5342
    [Peter] => 5623
)

*/

?>
up
-7
robbieaverill[at]gmail.com
2 years ago
Another option for older PHP versions (pre 5.5.0) is to use array_walk():

<?php
$array
= array(
  array(
'some' => 'var', 'foo' => 'bar'),
  array(
'some' => 'var', 'foo' => 'bar'),
  array(
'some' => 'var', 'foo' => 'bar')
);

array_walk($array, function(&$value, $key, $return) {
 
$value = $value[$return];
},
'foo');

print_r($array);

// Array
// (
//     [0] => bar
//     [1] => bar
//     [2] => bar
// )

?>
up
-9
coviex
2 years ago
Value for existing key in the resulting array is rewritten with new value if it exists in another source sub-array.
up
-13
myles at smyl dot es
2 years ago
This didn't work for me recursively and needed to come up with a solution.

Here's my solution to the function:

if ( ! function_exists( 'array_column_recursive' ) ) {
    /**
     * Returns the values recursively from columns of the input array, identified by
     * the $columnKey.
     *
     * Optionally, you may provide an $indexKey to index the values in the returned
     * array by the values from the $indexKey column in the input array.
     *
     * @param array $input     A multi-dimensional array (record set) from which to pull
     *                         a column of values.
     * @param mixed $columnKey The column of values to return. This value may be the
     *                         integer key of the column you wish to retrieve, or it
     *                         may be the string key name for an associative array.
     * @param mixed $indexKey  (Optional.) The column to use as the index/keys for
     *                         the returned array. This value may be the integer key
     *                         of the column, or it may be the string key name.
     *
     * @return array
     */
    function array_column_recursive( $input = NULL, $columnKey = NULL, $indexKey = NULL ) {

        // Using func_get_args() in order to check for proper number of
        // parameters and trigger errors exactly as the built-in array_column()
        // does in PHP 5.5.
        $argc   = func_num_args();
        $params = func_get_args();
        if ( $argc < 2 ) {
            trigger_error( "array_column_recursive() expects at least 2 parameters, {$argc} given", E_USER_WARNING );

            return NULL;
        }
        if ( ! is_array( $params[ 0 ] ) ) {
            // Because we call back to this function, check if call was made by self to
            // prevent debug/error output for recursiveness :)
            $callers = debug_backtrace();
            if ( $callers[ 1 ][ 'function' ] != 'array_column_recursive' ){
                trigger_error( 'array_column_recursive() expects parameter 1 to be array, ' . gettype( $params[ 0 ] ) . ' given', E_USER_WARNING );
            }

            return NULL;
        }
        if ( ! is_int( $params[ 1 ] )
             && ! is_float( $params[ 1 ] )
             && ! is_string( $params[ 1 ] )
             && $params[ 1 ] !== NULL
             && ! ( is_object( $params[ 1 ] ) && method_exists( $params[ 1 ], '__toString' ) )
        ) {
            trigger_error( 'array_column_recursive(): The column key should be either a string or an integer', E_USER_WARNING );

            return FALSE;
        }
        if ( isset( $params[ 2 ] )
             && ! is_int( $params[ 2 ] )
             && ! is_float( $params[ 2 ] )
             && ! is_string( $params[ 2 ] )
             && ! ( is_object( $params[ 2 ] ) && method_exists( $params[ 2 ], '__toString' ) )
        ) {
            trigger_error( 'array_column_recursive(): The index key should be either a string or an integer', E_USER_WARNING );

            return FALSE;
        }
        $paramsInput     = $params[ 0 ];
        $paramsColumnKey = ( $params[ 1 ] !== NULL ) ? (string) $params[ 1 ] : NULL;
        $paramsIndexKey  = NULL;
        if ( isset( $params[ 2 ] ) ) {
            if ( is_float( $params[ 2 ] ) || is_int( $params[ 2 ] ) ) {
                $paramsIndexKey = (int) $params[ 2 ];
            } else {
                $paramsIndexKey = (string) $params[ 2 ];
            }
        }
        $resultArray = array();
        foreach ( $paramsInput as $row ) {
            $key    = $value = NULL;
            $keySet = $valueSet = FALSE;
            if ( $paramsIndexKey !== NULL && array_key_exists( $paramsIndexKey, $row ) ) {
                $keySet = TRUE;
                $key    = (string) $row[ $paramsIndexKey ];
            }
            if ( $paramsColumnKey === NULL ) {
                $valueSet = TRUE;
                $value    = $row;
            } elseif ( is_array( $row ) && array_key_exists( $paramsColumnKey, $row ) ) {
                $valueSet = TRUE;
                $value    = $row[ $paramsColumnKey ];
            }

            $possibleValue = array_column_recursive( $row, $paramsColumnKey, $paramsIndexKey );
            if ( $possibleValue ) {
                $resultArray = array_merge( $possibleValue, $resultArray );
            }

            if ( $valueSet ) {
                if ( $keySet ) {
                    $resultArray[ $key ] = $value;
                } else {
                    $resultArray[ ] = $value;
                }
            }
        }

        return $resultArray;
    }
}
To Top