根据 https://wiki.php.net/rfc/array_column array_column 预计将很快添加到 PHP 中。但我在理解 RFC 时遇到了困难。如果指定的键不存在,会返回什么?
示例:
$arr = array(
array(
'firstname' => 'Bob',
'lastname' => 'Tomato'
),
array(
'firstname' => 'Larry',
'lastname' => 'Cucumber'
)
);
$middlenames = array_column($arr, 'middlename');
简介
为了理解 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"
更复杂的 Senerio
想象一下你希望你的数组有这个输出
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);
现在你可以看到我必须使用
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 <------- Otherwise returns empty array
(
)
结论
我使用了很多不同的例子,使用
loop
、array_map
、array_reduce
和 MultipleIterator
来解释 array_column
想要实现的目标。
正如您所看到的
array_column
更加简化,但是 我建议您稍微尝试一下 RFC 中的示例,如果您仍然不理解,这将使您更好地理解它。 PHP 是一种灵活的语言,您始终可以实现自己的版本。
根据:https://wiki.php.net/rfc/array_column
当找不到对应的indexKey时,该值将以整数作为键,从零开始。
RFC 中使用的示例:
$mismatchedColumns = array(
array(
'a' => 'foo',
'b' => 'bar',
'e' => 'baz'
),
array(
'a' => 'qux',
'c' => 'quux',
'd' => 'corge'
),
array(
'a' => 'grault',
'b' => 'garply',
'e' => 'waldo'
),
);
$foo = array_column($mismatchedColumns, 'a', 'b');
结果
$foo
等于:
Array
(
[bar] => foo
[0] => qux
[garply] => grault
)
本质上,a处的值成为新的数组值,而b成为键。当原始数组不包含键 b 时,它会创建一个 0 索引并使用它。如果有多个不存在的键,它们将从0开始递增。
进一步研究他们的示例,它暗示当您无法匹配原始数组中的值时,您根本不会获得数组元素。这意味着如果您在数组中查找单个值并且它不存在,它将返回一个空数组。
附注我显然从未使用过这个函数,所以大部分都是对 RFC 的解释。
顺便说一句,该函数已被接受并包含在 PHP 中,最初由 Ben Ramsey 提出,最终投票结果为 38 票赞成,6 票反对。邮件列表讨论可以在这里查看:http://grokbase.com/t/php/php-internals/126nxxa80p/draft-rfc-array-column-function。另请参阅https://github.com/php/php-src/pull/257