如何在不循环的情况下获取多维数组中特定“键”的数组


115

假设我有以下多维数组(从MySQL或服务检索):

array(
    array(
        [id] => xxx,
        [name] => blah
    ),
    array(
        [id] => yyy,
        [name] => blahblah
    ),
    array(
        [id] => zzz,
        [name] => blahblahblah
    ),
)

我们可以id在一个“ 内置 ” php函数调用中获得一组s 吗?或一行代码?
我知道传统的循环并获得价值,但是我不需要这个:

foreach($users as $user) {
    $ids[] = $user['id'];
}
print_r($ids);

也许有些array_map()call_user_func_array()可以做的魔力。


“我们可以在一个函数调用中获得一组ID吗?” 是的,但是您必须编写该函数
:)

@BorisGuéry,我的意思是内置功能:-)
ifaour 2011年

2
PS:我知道我可以写成foreach($users as $user) {$ids[] = $user['id'];}一行!但您知道我的意思/需要:-)
ifaour 2011年

@Eugene,显然我需要数组来做其他事情。同样,这只是为了娱乐和学习PHP的新速记。
ifaour 2011年

Answers:


261

从php 5.5开始,您可以使用array_column

$ids = array_column($users, 'id');

这是任何现代项目的首选选项。但是,如果必须支持php> 5.5,则存在以下替代方法:

从php 5.3开始,您可以使用array_map匿名函数,如下所示:

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

(技术上为PHP 4.0.6+)之前,您必须创建一个匿名函数,create_function而不是:

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);

好了,现在如果有一个本机函数类似于键的function ($ar) {return $ar['id'];}返回值,那将非常棒!:-)
ifaour 2011年

1
好吧,这不是一个“多合一”功能,但是Closure(匿名功能)是一个非常强大的概念,可用于此类处理,您宁愿知道如何使用它们。
鲍里斯·格里(BorisGuéry)2011年

如果我也想获得钥匙怎么办?假设:$ arr = ['ball'=> ['basket'=> 5]]; 我想得到:$ ball = ['ball'=> 5];
昂热

2
@Angger然后您有一个与此问题不同的问题。只要您详细提及期望的行为即可随意询问,例如,输入为时将产生什么结果['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]]
phihag

从PHP7.4开始,您可以使用array_map箭头功能:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546

13

PHP 5.5以上

从PHP5.5 +开始,您可以使用array_column(),这使得以下所有内容都已过时。

PHP 5.3以上

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

@phihag提供的解决方案将从PHP 5.3.0开始在PHP中完美运行,如果在此之前需要支持,则需要复制该wp_list_pluck。

PHP <5.3

WordPress的3.1+

在Wordpress中,有一个名为wp_list_pluck的函数( 如果您使用的是Wordpress)可以解决您的问题。

PHP <5.3

如果您不使用Wordpress,则由于代码是开源的,因此可以将代码复制粘贴到项目中(并将函数重命名为喜欢的名称,例如array_pick)。在此处查看源


3

如果id是数组中的第一个键,则将执行以下操作:

$ids = array_map('current', $users);

但是,您不必一定要依靠它。:)


-1

array_reduce()如果您更喜欢功能性的方法,也可以使用

例如:

$userNames = array_reduce($users, function ($carry, $user) {
    array_push($carry, $user['name']);
    return $carry;
}, []);

或者,如果您想花哨,

$userNames = [];
array_map(function ($user) use (&$userNames){
    $userNames[]=$user['name'];
}, $users);

但是,上述方法和所有上述方法都会在后台循环;)


您的第一个示例将不返回数组,仅返回在数组中为$ user ['name']找到的最后一个值。您需要推/附加到$ carry并随即返回$ carry。
Progrock
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.