【问题标题】:How to get an array of specific "key" in multidimensional array without looping [duplicate]如何在不循环的情况下获取多维数组中特定“键”的数组
【发布时间】:2011-12-21 02:59:03
【问题描述】:

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

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

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

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

也许一些array_map()call_user_func_array() 可以施展魔法。

【问题讨论】:

  • "我们可以在一个函数调用中获得一组 id 吗?"是的,但你必须编写函数:)
  • @BorisGuéry,我的意思是内置函数 :-)
  • P.S:我知道我可以在一行中写出foreach($users as $user) {$ids[] = $user['id'];}!但你知道我的意思/需要:-)
  • @Eugene,我显然需要数组来处理其他事情。再说一遍,这只是为了好玩和学习 PHP 中的新速记。

标签: php


【解决方案1】:

从 PHP 5.5 开始,你可以使用array_column:

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

这是任何现代项目的首选选项。但是,如果您必须支持 PHP

从 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'];} 的本机函数返回键值,那就太棒了! :-)
  • 嗯,这不是一个“一体化”功能,但闭包(匿名函数)是一个非常强大的概念,可以用于此类处理,您宁愿知道如何使用它们.
  • 如果我也想拿到钥匙怎么办?假设:$arr = ['ball'=>['basket'=>5]];我想得到:$ball = ['ball'=>5];
  • @Angger 那么你有一个与这个不同的问题。随意ask it,只要您详细提及您期望的行为,例如如果输入为['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]] 会产生什么结果。
  • 从 PHP7.4 开始,您可以使用带有箭头函数的array_map$ids = array_map(fn ($ar) => $ar['id'], $users);
【解决方案2】:

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 WordPress 3.1+

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

PHP 如果您不使用 Wordpress,由于代码是开源的,您可以将代码复制粘贴到您的项目中(并将函数重命名为您喜欢的名称,例如 array_pick)。 View source here

【讨论】:

    【解决方案3】:

    如果id 是数组中的第一个键,则可以这样做:

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

    不过,您不一定要依赖它。 :)

    【讨论】:

      【解决方案4】:

      如果您喜欢更实用的方法,也可以使用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。
      猜你喜欢
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2023-03-29
      • 2022-01-02
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多