如果键名不存在,array_column会返回什么?

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

2
链接或不存在。 - Linus Kleen
1
这个函数 array_column 是什么? - user1646111
3
你有没有尝试过它? - Kermit
5
这篇文章可能因为本网站不涉及猜测而被downvote和关闭;很明显,你没有尝试它,因为它还没有被包含在一个RC中。也许这种情况会持续很长一段时间。总之,这不是一个讨论论坛。(也不是一个论坛本身。) - Linus Kleen
4
这是一个测试案例,答案是一个空数组。 - salathe
显示剩余5条评论
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;
}

现场测试

或者更好的是,使用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_shiftcurrent来获取前两个元素。随着数组的增长,这可能变得复杂,但是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 
(
)

结论

我使用了很多不同的例子,使用looparray_maparray_reduceMultipleIterator来解释array_column试图实现什么。

正如你所看到的,array_column更加简化,但是如果你还不理解,我建议你尝试一下RFC中的例子,这样会让你更好地理解它。PHP是一种灵活的语言,你总是可以实现自己的版本。


6
根据https://wiki.php.net/rfc/array_column

当找不到相应的索引键时,该值将以从零开始的整数作为键。

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开始递增。
进一步研究它们的示例,可以发现当您无法在原始数组中匹配值时,根本就不会得到数组元素。这意味着,如果您正在查找数组中的单个值并且它不存在,它将返回一个空数组。
附带说明,这个函数已被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

3
我不明白。你能举个例子吗? - Isius
3
你的例子与原帖并不完全相同。 - gen_Eric
@RocketHazmat:我删除了一个部分,它展示了如果以这种方式初始化,类似的数组会是什么样子。 - Jeremy Harris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接