php对二维数组进行相关操作(排序、转换、去空白等)


Posted in PHP onNovember 04, 2015

技巧提示:

array_keys($array) //返回所有键名 
 
array_values($array) //返回所有键值  
 
$result=array_reverse($input); //将数组颠倒,不保留键名 
$result_keyed=array_reverse($input,true); //将数组颠倒,保留键名 
 
array_keys($array,"blue"); //返回值为blue的键名

1. PHP二维数组去重复项函数 
PHP数组去除重复项有个内置函数array_unique (),但是php的 array_unique函数只适用于一维数组,对多维数组并不适用,以下提供一个二维数组的array_unique函数

function unique_arr($array2D,$stkeep=false,$ndformat=true) 
{ 
  // 判断是否保留一级数组键 (一级数组键可以为非数字) 
  if($stkeep) $stArr = array_keys($array2D); 
 
  // 判断是否保留二级数组键 (所有二级数组键必须相同) 
  if($ndformat) $ndArr = array_keys(end($array2D)); 
 
  //降维,也可以用implode,将一维数组转换为用逗号连接的字符串 
  foreach ($array2D as $v){ 
    $v = join(",",$v);  
    $temp[] = $v; 
  } 
 
  //去掉重复的字符串,也就是重复的一维数组 
  $temp = array_unique($temp);  
 
  //再将拆开的数组重新组装 
  foreach ($temp as $k => $v) 
  { 
    if($stkeep) $k = $stArr[$k]; 
    if($ndformat) 
    { 
      $tempArr = explode(",",$v);  
      foreach($tempArr as $ndkey => $ndval) $output[$k][$ndArr[$ndkey]] = $ndval; 
    } 
    else $output[$k] = explode(",",$v);  
  } 
 
  return $output; 
}
$array2D = array('first'=>array('title'=>'1111','date'=>'2222'),'second'=>array('title'=>'1111','date'=>'2222'),'third'=>array('title'=>'2222','date'=>'3333')); 
 
 
print_r($array2D); 
print_r(unique_arr($array2D,true));

2. 二维数组的排序方法
一维数组排序方法:
公用函数:

function printr($arr) 
{ 
  echo '<pre>';  
  print_r($arr); 
  echo '</pre><br>'; 
}

第一组 :sort 和 rsort ,按照PHP数组键值的顺序asc和逆序desc进行排序,同时破坏原来数组的索引关系——其实是删除索引之后重新建立从0开始的数字索引。

$a = array('a'=>1,2);  
sort($a); printr($a);  
rsort($a); printr($a); 
 
/*Array 
( 
  [0] => 1 
  [1] => 2 
) 
 
Array 
( 
  [0] => 2 
  [1] => 1 
) 
*/

第二组函数:asort 和 arsort ,这两个函数就比较厉害一点了,只要他们可以保留数组原有的索引关系,把上例的sort 和 rsort 分别用这两个函数替换一下

$a = array('a'=>1,2); 
asort($a); printr($a);   
arsort($a); printr($a);  
/* 
Array 
( 
  [a] => 1 
  [0] => 2 
) 
 
Array 
( 
  [0] => 2 
  [a] => 1 
) 
*/

第三组PHP数组排序函数:krsort 和 ksort ,这两个不同于以上两组,这两函数是对键名进行排序的.

$a = array('a'=>1,2); 
 ksort($a); printr($a);   
krsort($a); printr($a); 
 
/* 
Array 
( 
  [0] => 2 
  [a] => 1 
) 
 
Array 
( 
  [a] => 1 
  [0] => 2 
) 
*/

通过自定义函数对PHP数组进行排序,有三个函数分别是:
uasort 通过自定义函数对PHP数组的键值进行排序,并且保留原来的索引关系。
uksort 通过自定义函数对PHP数组的键名进行排序,并且保留原来的索引关系。
usort通过自定义函数对PHP数组的键值进行排序,并且删除原来的索 引关系,从零开始建立新的索引。
下面是二维排序

/** 
 * @package   BugFree 
 * @version   $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $ 
 * 
 * 
 * Sort an two-dimension array by some level two items use array_multisort() function. 
 * 
 * sortArr($Array,"Key1","SORT_ASC","SORT_RETULAR","Key2"……) 
 * @author           Chunsheng Wang <wwccss@263.net> 
 * @param array  $ArrayData  the array to sort. 
 * @param string $KeyName1  the first item to sort by. 
 * @param string $SortOrder1 the order to sort by("SORT_ASC"|"SORT_DESC") 
 * @param string $SortType1  the sort type("SORT_REGULAR"|"SORT_NUMERIC"|"SORT_STRING") 
 * @return array        sorted array. 
 */ 
function sortArr($ArrayData,$KeyName1,$SortOrder1 = "SORT_ASC",$SortType1 = "SORT_REGULAR") 
{ 
  if(!is_array($ArrayData)) return $ArrayData; 
   
  // Get args number. 
  $ArgCount = func_num_args(); 
  // Get keys to sort by and put them to SortRule array. 
  for($I = 1;$I < $ArgCount;$I ++) 
  { 
    $Arg = func_get_arg($I); 
    if(!eregi("SORT",$Arg)) 
    { 
      $KeyNameList[] = $Arg; 
      $SortRule[]  = '$'.$Arg; 
    } 
    else $SortRule[]  = $Arg; 
  } 
  // Get the values according to the keys and put them to array. 
  foreach($ArrayData AS $Key => $Info) 
  { 
    foreach($KeyNameList AS $KeyName) ${$KeyName}[$Key] = strtolower($Info[$KeyName]); 
  } 
   
  // Create the eval string and eval it. 
  $EvalString = 'array_multisort('.join(",",$SortRule).',$ArrayData);'; 
  eval ($EvalString); 
  return $ArrayData; 
}

实例:

//################# 示例 ################# 
$arr = array( 
 array( 
   'name'    =>  '学习', 
   'size'    =>  '1235', 
   'type'    =>  'jpe', 
   'time'    =>  '1921-11-13', 
   'class'    =>  'dd', 
 ), 
 array( 
   'name'    =>  '中国功夫', 
   'size'    =>  '153', 
   'type'    =>  'jpe', 
   'time'    =>  '2005-11-13', 
   'class'    =>  'jj', 
 ), 
 array( 
   'name'    =>  '编程', 
   'size'    =>  '35', 
   'type'    =>  'gif', 
   'time'    =>  '1997-11-13', 
   'class'    =>  'dd', 
 ), 
 array( 
   'name'    =>  '中国功夫', 
   'size'    =>  '65', 
   'type'    =>  'jpe', 
   'time'    =>  '1925-02-13', 
   'class'    =>  'yy', 
 ), 
 array( 
   'name'    =>  '中国功夫', 
   'size'    =>  '5', 
   'type'    =>  'icon', 
   'time'    =>  '1967-12-13', 
   'class'    =>  'rr', 
 ), 
); 
 
echo '<pre>'; 
print_r($arr); echo '<br>'; 
 
//注意:按照数字方式排序时 153 比 65 小 
$temp = sortArr($arr,"name","SORT_ASC","type","SORT_DESC","size","SORT_ASC","SORT_STRING"); 
 
print_r($temp); 
 
echo '</pre>';

3. 多维数组转一维数组

function rebuild_array($arr){ //rebuild a array 
 static $tmp=array(); 
 
 for($i=0; $i<count($arr); $i++){ 
  if(is_array($arr[$i])){ 
    rebuild_array($arr[$i]); 
  }else{ 
    $tmp[]=$arr[$i]; 
  } 
 } 
 
 return $tmp; 
}

 实例:

$arr=array('123.html','456.html',array('dw.html','fl.html',array('ps.html','fw.html')),'ab.html'); 
 
// 定义一个三维数组,用来检测我们的函数 
echo '<pre>'; 
print_r(rebuild_array($arr)); 
echo '</pre>';

4. 从数组中删除空白的元素

function array_remove_empty(&$arr, $trim = true)   
{   
  foreach ($arr as $key => $value) {   
    if (is_array($value)) {   
      array_remove_empty($arr[$key]);   
    } else {   
      $value = trim($value);   
      if ($value == '') {   
        unset($arr[$key]);   
      } elseif ($trim) {   
        $arr[$key] = $value;   
      }  
    }   
  }   
}

实例:

$a = array(array(3),2,'',array('',23),0); 
 
array_remove_empty($a); 
 
printr($a); // printr 函数请在本文中找

5. 获取多维数组下特定键下的值,并生成一维数组

function getall_by_key(array $arr, $key){ 
  if (!trim($key)) return false; 
  preg_match_all("/\"$key\";\w{1}:(?:\d+:|)(.*?);/", serialize($arr), $output); 
  return $output[1]; 
} 
 
$testArr = array('111'=> 100, 'out'=> 200, '333' => array('out' => 310, array(321, 322, 'out' => "this is a test"))); 
 
printr(getall_by_key($testArr, 'out'));

以上就是本文的全部内容,php对于二维数组的相应操作介绍的很详细,希望对大家的学习有所帮助。

PHP 相关文章推荐
php开发环境配置记录
Jan 14 PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
memcache命令启动参数中文解释
Jan 13 PHP
php 获取页面中指定内容的实现类
Jan 23 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
PHP批量生成图片缩略图的方法
Jun 18 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
PHP命名空间namespace的定义方法详解
Mar 29 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
两种php去除二维数组的重复项方法
Nov 04 #PHP
PHP扩展开发教程(总结)
Nov 04 #PHP
PHP实现GIF图片验证码
Nov 04 #PHP
php实现分页显示
Nov 03 #PHP
PHP翻页跳转功能实现方法
Nov 30 #PHP
php中注册器模式类用法实例分析
Nov 03 #PHP
php实现zip文件解压操作
Nov 03 #PHP
You might like
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
php将会员数据导入到ucenter的代码
2010/07/18 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
批处理与python代码混合编程的方法
2016/05/19 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
TensorFlow实现Logistic回归
2018/09/07 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
大学生毕业自我鉴定
2013/11/06 职场文书
高三学习决心书
2014/03/11 职场文书
关于旅游的活动方案
2014/08/15 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫