©
本文档使用
php.cn手册 发布
(PHP 5 >= 5.5.0, PHP 7)
array_column — 返回数组中指定的一列
$input
, mixed $column_key
[, mixed $index_key
] ) array_column()
返回input
数组中键值为column_key
的列,
如果指定了可选参数index_key
,那么input
数组中的这一列的值将作为返回数组中对应值的键。
input
需要取出数组列的多维数组(或结果集)
column_key
需要返回值的列,它可以是索引数组的列索引,或者是关联数组的列的键。
也可以是 NULL
,此时将返回整个数组(配合index_key
参数来重置数组键的时候,非常管用)
index_key
作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。
从多维数组中返回单列数组
Example #1 从结果集中取出first names列
<?php
// Array representing a possible record set returned from a database
$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 )
Example #2 从结果集中总取出last names列,用相应的id作为键值
<?php
// Using the $records array from Example #1
$last_names = array_column ( $records , 'last_name' , 'id' );
print_r ( $last_names );
?>
以上例程会输出:
Array ( [2135] => Doe [3245] => Smith [5342] => Jones [5623] => Doe )
[#1] antonfedonjuk at gmail dot com [2015-07-21 18:26:48]
My version is closer to the original than http://github.com/ramsey/array_column
<?php
if (!function_exists('array_column')) {
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;
}
}
?>
[#2] till at etill dot net [2015-05-28 15:32:59]
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.
[#3] marianbucur17 at yahoo dot com [2015-05-18 06:19:16]
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;
}, []);
}
}
[#4] mohanrajnr at gmail dot com [2015-05-06 07:50:52]
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);
}
}
[#5] robbieaverill[at]gmail.com [2015-03-23 19:51:27]
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
// )
?>
[#6] kiler129 @ nowhere [2015-01-10 02:31:20]
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) { }
[#7] hypxm at qq dot com [2014-12-09 06:36:03]
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;
}
[#8] coviex [2014-11-30 16:53:00]
Value for existing key in the resulting array is rewritten with new value if it exists in another source sub-array.
[#9] myles at smyl dot es [2014-11-23 02:52:27]
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' ) ) {
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;
}
}
[#10] WARrior [2013-10-03 12:25:11]
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);