PHP 提取二维数组某一列的值转为一维数组的几种方法

2017年11月18日00:15:23 发表评论 121
阿里云优惠券

PHP中对二维数组某一列的提取,是个很常用的使用特别频繁的功能,正因为如此,PHP在5.5.0版本之后,添加了一个专用的函数array_column()。当然,如果你的PHP版本低于5.5.0,就得用别的方法处理了。

PHP 提取二维数组某一列的值转为一维数组的几种方法

例如,对于以下这个二维数组:

  1. $wosn_net?=?array(
  2. ????'0'?=>?array('id'?=>?100,?'username'?=>?'a1'),
  3. ????'1'?=>?array('id'?=>?101,?'username'?=>?'a2'),
  4. ????'2'?=>?array('id'?=>?102,?'username'?=>?'a3'),
  5. ????'3'?=>?array('id'?=>?103,?'username'?=>?'a4'),
  6. ????'4'?=>?array('id'?=>?104,?'username'?=>?'a5'),
  7. );

我们要提取其中的 usename 列,变成如下的一维数组:

  1. $username?=?array('a1',?'a2',?'a3',?'a4',?'a5');

处理方法主要有以下几种:

1、array_column函数法

array_column 是最简单的方法,但是要求PHP版本必须是5.5.0及以上版本,方法:

  1. $username?=?array_column($wosn_net,?'username');

输出结果:

  1. Array?(?[0]?=>?a1?[1]?=>?a2?[2]?=>?a3?[3]?=>?a4?[4]?=>?a5?)

注意:array_column();可以有第三个参数,它可以作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。如:

  1. $username?=?array_column($wosn_net,?'username','id');

输出:

  1. Array?(?[100]?=>?a1?[101]?=>?a2?[102]?=>?a3?[103]?=>?a4?[104]?=>?a5?)

注意以上两个输出的id区别;

 

2、array_walk函数法

array_walk()函数使用用户自定义函数对数组中的每个元素做回调处理,实现当前功能的方法:

  1. $username?=?array();
  2. array_walk($wosn_net,?function($value,?$key)?use?(&$username){
  3. ????$username[]?=?$value['username'];
  4. });

注:“function() use (){}”是php闭包的一种写法,详情见:PHP闭包(Closure)function() use(){}的使用方法

 

3、array_map函数法

array_map()函数和array_walk() 作用类似,将回调函数作用到给定数组的单元上。

  1. $username?=?array();
  2. array_map(function($value)?use?(&$username){
  3. ????$username[]?=?$value['username'];
  4. },?$wosn_net);

 

4、array_reduce函数法

使用array_reduce方法,代码略多,不过这个方法的想象空间(针对别的数组取值操作)还是蛮大的:

  1. $username?=?array_reduce($wosn_net,?create_function('$result,?$v',?'$result[]?=?$v["username"];return?$result;'));

输出:

  1. Array?(?[0]?=>?a1?[1]?=>?a2?[2]?=>?a3?[3]?=>?a4?[4]?=>?a5?)

array_reduce方法用回调函数迭代地将对数组的值进行操作,而create_function用于一个匿名方法做回调用,这个匿名方法的参数$result为上一次迭代产生的值,$v是当前的值,内部实现既为获取到数组$arr每一项的”username”的值并push到新$result数组;

 

5、foreach循环法

foreach循环相对上面的方法效率稍微低一些,但简单容易理解。

  1. $username?=?array();
  2. foreach?($wosn_net?as?$value)?{
  3. ????$username[]?=?$value['username'];
  4. }

注:本人的写法就是直接 foreach,然后 array_push 一个个的往一个数组变量里塞。这样的写法可能对性能有点影响,因为使用 PHP 原生的函数肯定比循环效率高。

 

6、array_map变种

方法如下,意为把$wosn_net数组的每一项值的开头值移出,并获取移除的值作为新数组。注意此时新数组$username的键仍是原数组$wosn_net的键,如下。

  1. $username?=?array_map('array_shift',?$wosn_net);

输出如下:

  1. Array?(?[0]?=>?100?[1]?=>?101?[2]?=>?102?[3]?=>?103?[4]?=>?104?)

注意:该功能会获取$wosn_net中的 id 列,而不是 username 列。输出数组的键为$wosn_net数组的键,这里重合了看不出效果。

另外,如果需要获取二维数组每一项的开头列或结尾列,也可以这样做:

  1. $username?=?array_map('reset',?$wosn_net);
  2. $username?=?array_map('end',?$wosn_net);

这三个变种方法作用比较局限,仅在获取第一列或最后一列的时候有用,在复杂的数组中就难以发挥作用了。

 

参考链接

https://www.awaimai.com/885.html

http://blog.it985.com/15036.html

http://blog.csdn.net/liruxing1715/article/details/22925575

历史上的今天:

  • 博主微信
  • 赶快加我来聊天吧
  • weinxin
  • 站长技术资源群
  • 群号:483950522
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: