6

根据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');
4

2 回答 2

9

介绍

为了让您了解,RFC您需要先了解问题及其引入的原因。

你的数组

$arr = array(
        array(
                'firstname' => 'Bob',    <--
                'lastname' => 'Tomato'     |    <--
        ),                                 |      |
        array(                             |      |
                'firstname' => 'Larry',  <--      |
                'lastname' => 'Cucumber'        <-|
        )
);

获取列

要获取Bob & LarryTomato 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;
}

现场测试

或 Better Sill 使用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_shiftcurrent获得前 2 个元素 .. 随着您的数组增长,这可能会变得复杂,但array_column会简化它

print_r(array_column($arr,"lastname","firstname"));
                              ^           ^
                              |           |
                             Value       Key    (I wonder why position is backwards)

输出

Array
(
    [Bob] => Tomato
    [Larry] => Cucumber
)

最后回到你的问题

What will be returned if a named key doesn't exist?

空数组......从你的例子

 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_maparray_reduceMultipleIteratorarray_column

如您所见array_column,它更加简化了,但我建议您稍微使用一下 RFC 中的示例,如果您仍然不理解它,这将使您更好地理解它,这PHP是一种灵活的语言,您始终可以实现自己的版本

于 2013-04-05T01:32:24.787 回答
6

根据: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 开始递增。

进一步研究他们的示例,它暗示当您无法匹配原始数组中的值时,您根本不会得到数组元素。这意味着如果您在数组中查找单个值并且它不存在,它将返回一个空数组。


PS我显然从来没有使用过这个功能,所以大部分是对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

于 2013-03-11T20:52:18.980 回答