PHP中对二维数组某一列的提取,是个很常用的使用特别频繁的功能,正因为如此,PHP在5.5.0版本之后,添加了一个专用的函数array_column()。当然,如果你的PHP版本低于5.5.0,就得用别的方法处理了。
例如,对于以下这个二维数组:
-
$wosn_net?=?array(
-
????'0'?=>?array('id'?=>?100,?'username'?=>?'a1'),
-
????'1'?=>?array('id'?=>?101,?'username'?=>?'a2'),
-
????'2'?=>?array('id'?=>?102,?'username'?=>?'a3'),
-
????'3'?=>?array('id'?=>?103,?'username'?=>?'a4'),
-
????'4'?=>?array('id'?=>?104,?'username'?=>?'a5'),
-
);
我们要提取其中的 usename 列,变成如下的一维数组:
-
$username?=?array('a1',?'a2',?'a3',?'a4',?'a5');
处理方法主要有以下几种:
1、array_column函数法
array_column 是最简单的方法,但是要求PHP版本必须是5.5.0及以上版本,方法:
-
$username?=?array_column($wosn_net,?'username');
输出结果:
-
Array?(?[0]?=>?a1?[1]?=>?a2?[2]?=>?a3?[3]?=>?a4?[4]?=>?a5?)
注意:array_column();可以有第三个参数,它可以作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。如:
-
$username?=?array_column($wosn_net,?'username','id');
输出:
-
Array?(?[100]?=>?a1?[101]?=>?a2?[102]?=>?a3?[103]?=>?a4?[104]?=>?a5?)
注意以上两个输出的id区别;
2、array_walk函数法
array_walk()函数使用用户自定义函数对数组中的每个元素做回调处理,实现当前功能的方法:
-
$username?=?array();
-
array_walk($wosn_net,?function($value,?$key)?use?(&$username){
-
????$username[]?=?$value['username'];
-
});
注:“function() use (){}”是php闭包的一种写法,详情见:PHP闭包(Closure)function() use(){}的使用方法。
3、array_map函数法
array_map()函数和array_walk() 作用类似,将回调函数作用到给定数组的单元上。
-
$username?=?array();
-
array_map(function($value)?use?(&$username){
-
????$username[]?=?$value['username'];
-
},?$wosn_net);
4、array_reduce函数法
使用array_reduce方法,代码略多,不过这个方法的想象空间(针对别的数组取值操作)还是蛮大的:
-
$username?=?array_reduce($wosn_net,?create_function('$result,?$v',?'$result[]?=?$v["username"];return?$result;'));
输出:
-
Array?(?[0]?=>?a1?[1]?=>?a2?[2]?=>?a3?[3]?=>?a4?[4]?=>?a5?)
array_reduce方法用回调函数迭代地将对数组的值进行操作,而create_function用于一个匿名方法做回调用,这个匿名方法的参数$result为上一次迭代产生的值,$v是当前的值,内部实现既为获取到数组$arr每一项的”username”的值并push到新$result数组;
5、foreach循环法
foreach循环相对上面的方法效率稍微低一些,但简单容易理解。
-
$username?=?array();
-
foreach?($wosn_net?as?$value)?{
-
????$username[]?=?$value['username'];
-
}
注:本人的写法就是直接 foreach,然后 array_push 一个个的往一个数组变量里塞。这样的写法可能对性能有点影响,因为使用 PHP 原生的函数肯定比循环效率高。
6、array_map变种
方法如下,意为把$wosn_net数组的每一项值的开头值移出,并获取移除的值作为新数组。注意此时新数组$username的键仍是原数组$wosn_net的键,如下。
-
$username?=?array_map('array_shift',?$wosn_net);
输出如下:
-
Array?(?[0]?=>?100?[1]?=>?101?[2]?=>?102?[3]?=>?103?[4]?=>?104?)
注意:该功能会获取$wosn_net中的 id 列,而不是 username 列。输出数组的键为$wosn_net数组的键,这里重合了看不出效果。
另外,如果需要获取二维数组每一项的开头列或结尾列,也可以这样做:
-
$username?=?array_map('reset',?$wosn_net);
-
$username?=?array_map('end',?$wosn_net);
这三个变种方法作用比较局限,仅在获取第一列或最后一列的时候有用,在复杂的数组中就难以发挥作用了。
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:duhaomu@163.com,我们将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读网站声明。