PHP实现提取多维数组指定一列的方法总结


Posted in PHP onDecember 04, 2019

本文实例讲述了PHP实现提取多维数组指定一列的方法。分享给大家供大家参考,具体如下:

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

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

$user = 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函数法

用PHP内置的 array_column() 函数是最简单的方法,限制是PHP版本必须是5.5.0及以上版本,方法:

$username = array_column($user, 'username');

2 array_walk函数法

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

$username = array();
array_walk($user, function($value, $key) use (&$username){
 $username[] = $value['username'];
});

3 array_map函数法

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

$username = array();
array_map(function($value) use (&$username){
 $username[] = $value['username'];
}, $user);

实际使用时,我们可以用array_map()写出和PHP内置array_column()一样功能的函数:

/**
 * 获取二维数组指定的一列,并以一维数组格式返回
 * 作用和PHP5.5.0中的array_column()函数一样
 * @param $input array 需要取出数组列的多维数组(或结果集)
 * @param $column_key string 需要返回值的列,它可以是索引数组的列索引,或者是关联数组的列的键。 也可以是NULL,此时将返回整个数组
 * @param $index_key string 作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。
 * @return array|null
 */
function array_column($input, $column_key, $index_key = null) {
 $arr = array_map(function($d) use ($column_key, $index_key) {
  if (!isset($d[$column_key])) {
   return null;
  }
  if ($index_key !== null) {
   return array($d[$index_key] => $d[$column_key]);
  }
  return $d[$column_key];
 }, $input);
 if ($index_key !== null) {
  $tmp = array();
  foreach ($arr as $ar) {
   $tmp[key($ar)] = current($ar);
  }
  $arr = $tmp;
 }
 return $arr;
}

4 foreach循环法

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

$username = array();
foreach ($user as $value) {
 $username[] = $value['username'];
}

5 array_map变种

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

$username = array_map('array_shift', $user);

注意:该功能会获取$user中的 id 列,而不是 username 列。

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

$username = array_map('reset', $user);
$username = array_map('end', $user);

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

参考资料:

  1. php获取二维数组中某一列的值集合
  2. php 快速的对二维数组某一列进行组装的方法

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
php str_replace的替换漏洞
Mar 15 PHP
PHP基本语法总结
Sep 06 PHP
thinkPHP查询方式小结
Jan 09 PHP
Yii实现简单分页的方法
Apr 29 PHP
php支持断点续传、分块下载的类
May 02 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 31 PHP
php探针使用原理和技巧讲解
Sep 17 PHP
php文件上传原理与实现方法详解
Dec 20 PHP
基于PHP实现生成随机水印图片
Dec 09 PHP
php实现快速对二维数组某一列进行组装的方法小结
Dec 04 #PHP
PHP实现发送微博消息功能完整示例
Dec 04 #PHP
PHP连续签到功能实现方法详解
Dec 04 #PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 #PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 #PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 #PHP
Laravel框架Blade模板简介及模板继承用法分析
Dec 03 #PHP
You might like
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
有关php运算符的知识大全
2011/11/03 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
prototype Element学习笔记(篇一)
2008/10/26 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
AngularJS模块管理问题的非常规处理方法
2015/04/29 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
javascript基本语法
2016/05/31 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
Python中单、双下划线的区别总结
2017/12/01 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
Java基础面试题
2012/11/02 面试题
企划经理的岗位职责
2013/11/17 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
文明村创建实施方案
2014/03/27 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
2016年学校禁毒宣传活动工作总结
2016/04/05 职场文书
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS