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

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);

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

温馨提示:
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:duhaomu@163.com,我们将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读网站声明

给TA赞赏
共{{data.count}}人
人已赞赏
未整理

【超燃计划】30天蜕变行动营,干掉平庸的自己

2021-3-23 0:00:00

未整理

一站式搞定视频号运营变现,从0到1学视频号运营实操培训课程视频

2021-3-25 0:00:00

0 条回复 A文章作者 M管理员
----《》
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索