介绍
要理解RFC,您首先需要了解问题以及引入该标准的原因。
您的数组
$arr = array(
array(
'firstname' => 'Bob', <--
'lastname' => 'Tomato' | <--
), | |
array( | |
'firstname' => 'Larry', <-- |
'lastname' => 'Cucumber' <-|
)
);
获取列
要获取Bob & Larry
或Tomato and Cucumber
,您需要使用多行代码示例,例如:
$colums = array();
foreach ( array_map(null, $arr[0], $arr[1]) as $value ) {
$colums[] = $value;
}
print_r($colums);
输出
Array
(
[0] => Array
(
[0] => Bob
[1] => Larry
)
[1] => Array
(
[0] => Tomato
[1] => Cucumber
)
)
动态版本
如果你知道元素的数量,上面的代码才能正常工作。另一种创造性的方法是:
$colums = array();
array_unshift($arr, null);
foreach (call_user_func_array("array_map", $arr) as $value ) {
$colums[] = $value;
}
现场测试
或者更好的是,使用MultipleIterator
$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ALL);
foreach ( $arr as $v ) {
$mi->attachIterator(new ArrayIterator($v));
}
$colums = array();
foreach ( $mi as $v ) {
$colums[] = $v;
}
print_r($colums);
实时测试
关键名称
如果你需要获取关键名称,这里还有另一种方法
$colums = array_reduce($arr, function ($a, $b) {
foreach ( $b as $k => $v ) {
$a[$k][] = $v;
}
return $a;
});
实时测试
返回array_column
array_column
的意图很简单,获取所有包含名字的列就像下面这样简单:
print_r(array_column($arr,"lastname"));
^
|
+--- This get value with key "lastname"
实时测试
更复杂的情况
想象一下,你希望你的数组有这个输出
Array
(
[Bob] => Tomato
[Larry] => Cucumber
)
使用旧方法,你可以拥有。
$colums = array();
array_unshift($arr, null);
foreach (call_user_func_array("array_map", $arr) as $value ) {
$key = array_shift($value);
$colums[$key] = current($value);
}
print_r($colums);
{{link1:现在你可以看到我不得不使用array_shift
和current
来获取前两个元素。随着数组的增长,这可能变得复杂,但是array_column
可以简化这个过程:
print_r(array_column($arr,"lastname","firstname"));
^ ^
| |
Value Key (I wonder why position is backwards)
输出
Array
(
[Bob] => Tomato
[Larry] => Cucumber
)
最后回答你的问题
如果一个命名键不存在,会返回什么?
根据你的示例,会返回一个空数组。
print_r(array_column($arr,"middlename"));
^
|
it would try to check if any of your array has key middle man
它返回
Array <
(
)
结论
我使用了很多不同的例子,使用loop
、array_map
、array_reduce
和MultipleIterator
来解释array_column
试图实现什么。
正如你所看到的,array_column
更加简化,但是如果你还不理解,我建议你尝试一下RFC中的例子,这样会让你更好地理解它。PHP是一种灵活的语言,你总是可以实现自己的版本。