[PHP]我想在保持数组键的同时使用array_column


关于array_column

PHP的array_column是一个非常有用的函数,可以从多维数组返回单列值。

的PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// このような多次元配列から…
$array = [
  2 => [ 'id' => 111, 'name' => 'suzuki', 'age' => 21 ],
  3 => [ 'id' => 222, 'name' => 'sato',   'age' => 34 ],
  5 => [ 'id' => 333, 'name' => 'tanaka', 'age' => 55 ],
];

// 単一のカラム値の配列を作れる
var_export( array_column( $array, 'name' ) );
// array (
//   0 => 'suzuki',
//   1 => 'sato',
//   2 => 'tanaka',
// )

但是,返回数组的键是

  • 如果未指定第三个参数:只需从0重新分配

  • 当指定第三个参数时:指定列的值用作键

的任何一个都不保留原始数组的键(在上面的示例中为" 2"," 3"," 5")。

当您想要保留原始阵列的键

我们将介绍以下三种方法。

  • 方法①将array_column与其他功能组合

  • 方法②使用array_map

  • 方法③使用foreach

* 2020/10/14在第一次发布本文时,仅介绍了方法(1),但除了@tadsan在注释部分中介绍的方法(2)外,还使用了foreach方法③也已添加。此外,摘要的内容已更改,并添加了array_column左右的蛇脚。

方法(1)将array_column与其他功能组合

使用

array_keys获取原始数组的键,并将其与未指定第三个参数的返回值array_column组合。使用array_combine生成相应的数组。

的PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$array = [
  2 => [ 'id' => 111, 'name' => 'suzuki', 'age' => 21 ],
  3 => [ 'id' => 222, 'name' => 'sato',   'age' => 34 ],
  5 => [ 'id' => 333, 'name' => 'tanaka', 'age' => 55 ],
];

// キーを配列として取得
$keys = array_keys( $array ); // => [ 2, 3, 5 ]
// 指定要素を配列として取得
$values = array_column( $array, 'name' ); // => [ 'suzuki', 'sato', 'tanaka' ]
// それぞれの配列を合体
$combined = array_combine( $keys, $values );
// 出力
var_export( $combined );
// array (
//   2 => 'suzuki',
//   3 => 'sato',
//   5 => 'tanaka',
// )

可以将以下操作写在一行中。

的PHP

1
array_combine( array_keys( $array ), array_column( $array, 'name' ) );
  • 优点:很容易理解您使用功能的方式

  • 缺点:许多函数调用

方法②使用array_map

尽管文章说"我想使用array_column",但标题欺诈也不错,但是我可以更简洁地描述它(我在评论部分告诉@tadsan)。

(从评论部分复制并粘贴)

1
2
3
4
5
6
7
$array = [
  2 => [ 'id' => 111, 'name' => 'suzuki', 'age' => 21 ],
  3 => [ 'id' => 222, 'name' => 'sato',   'age' => 34 ],
  5 => [ 'id' => 333, 'name' => 'tanaka', 'age' => 55 ],
];

var_dump(array_map(fn($a) => $a['name'], $array));

提取以上代码的数组操作部分如下。

(从评论部分复制并粘贴)

1
array_map(fn($a) => $a['name'], $array);

由于

array_map的第一个参数的fn($a) => $a['name']部分是PHP 7.4中引入的"箭头函数",因此将在7.4之前的环境中使用"匿名函数"代替它。

的PHP

1
array_map( function ($a) { return $a['name']; }, $array );
  • 优点:可以在可以使用箭头功能的环境中进行简洁描述

  • 缺点:在一个内衬中使用匿名函数时,可读性稍差

方法③使用foreach

直到那时,如果我被问到"是否存在array_column,这样我就不必使用foreach?",但是在方法(2)中我没有使用array_column,所以暂时存在。

的PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$array = [
  2 => [ 'id' => 111, 'name' => 'suzuki', 'age' => 21 ],
  3 => [ 'id' => 222, 'name' => 'sato',   'age' => 34 ],
  5 => [ 'id' => 333, 'name' => 'tanaka', 'age' => 55 ],
];

$result = [];
foreach ( $array as $key => $values ) {
  $result[ $key ] = $values['name'];
}
var_export( $result );
// array (
//   2 => 'suzuki',
//   3 => 'sato',
//   5 => 'tanaka',
// )
  • 优点:乍看之下容易理解

  • 缺点:需要临时变量,代码跨多行

摘要

建议使用方法②的array_map和箭头功能的一种衬纸,因为它的类型最少。如果出于意识形态的原因不想使用闭包,请

  • 如何将其放在一行①

  • 如何使任何人都容易看到的代码③

我认为

很好。我最后得出的结论与文章标题不符。

蛇纹石

array_column是PHP5.5引入的一个函数,但如果仔细观察,"在未指定第三个参数时保留原始数组键的计划"在发布之前就出现了。实际上已经发出了拉取请求,但似乎有一个讨论后被推迟的历史。很抱歉写这样的文章,但是我认为最好将其遗忘,因为在许多情况下,您不想保留原始数组的键。

除此之外,似乎还有一个"建议在第三个参数中指定true时保留原始数组的键",而且似乎甚至在发布后对此提案也有一些要求(一个问题在用PHP实现的array_column存储库中)。

但是,在PHP官方网站的此页面上(由于某种原因,←很难连接),进行了任何更改,例如"为第3个参数指定true的计划"和"第4个参数添加计划"。 array_column的实现者ramsey本人已关闭了该请求,因为它可以破坏该行为,并且将来似乎不太可能添加其他功能来维护该密钥。

参考

array_column --PHP.net 1

  • array_column的官方页面具有"当将-1作为第三个参数传递时,保留原始数组键的功能"。如果您复制并使用此功能,则可以像array_column_ext( $array,'name', -1 )一样简洁地编写它(我不知道是否可以在任何情况下使用它)。 ?