加入收藏 | 设为首页 | 会员中心 | 我要投稿 怀化站长网 (https://www.0745zz.cn/)- 语音技术、云资源管理、物联设备、云计算、决策智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php数组排序之多维数组与一维数组

发布时间:2022-07-24 10:18:47 所属栏目:PHP教程 来源:互联网
导读:我们知道在php数组中分为多维数组与一维数组,我们下面来分别讲述一下php多维数组与一维数组排序原理与实现方法吧。 一维数组 第一组:sort 和 rsort,按照PHP数组键值的顺序asc和逆序desc进行排序,同时破坏原来数组的索引关系其实是删除索引之后重新建立从0开
  我们知道在php数组中分为多维数组与一维数组,我们下面来分别讲述一下php多维数组与一维数组排序原理与实现方法吧。
 
  一维数组
 
  第一组:sort 和 rsort,按照PHP数组键值的顺序asc和逆序desc进行排序,同时破坏原来数组的索引关系——其实是删除索引之后重新建立从0开始的数字索引,看一下例程,代码如下:
 
  <?php
  $a = array("a"=>1,2);
  sort($a);
  var_dump($a);
   
  rsort($a);
  var_dump($a);
  ?>  
  看一下第一个输出结果,第一个输出:
 
  array(2) {
    [0]=>
    int(1)
    [1]=>
    int(2)
  }
  第二个输出:
 
  array(2) {
    [0]=>
    int(5)
    [1]=>
    int(4)
  }
  发现没有我们原来定义的索引a哪里去了?哪里去了?可以肯定的说是被他们无情的删除了,你要是对原来的索引关系并不在意的话,可以使用他们!
 
  第二组函数:asort 和 arsort,这两个函数就比较厉害一点了,只要他们可以保留数组原有的索引关系,把上例的sort 和 rsort 分别用这两个函数替换一下,看运行结果代码如下:
 
  array(2) {
    ["a"]=>
    int(1)
    [0]=>
    int(2)
  }
  array(2) {
    [0]=>
    int(2)
    ["a"]=>
    int(1)
  }
  这个一看就明白的,不用说了吧!
 
  第三组PHP数组排序函数:krsort 和 ksort 这两个不同于以上两组,这两函数是对键名进行排序的,大家可以把上例的函数替换成这两个,看看具体运行结果,这里也不说了,不然这个文章写的就太长了,怕有些兄弟没有耐心看到本文的重点,虽然重点就在下边!
 
  通过自定义函数对PHP数组进行排序,有三个函数分别是:
 
  uasort 通过自定义函数对PHP数组的键值进行排序,并且保留原来的索引关系。
 
  uksort 通过自定义函数对PHP数组的键名进行排序,并且保留原来的索引关系。
 
  usort通过自定义函数对PHP数组的键值进行排序,并且删除原来的索引关系,从零开始建立新的索引。
 
  这个地方当然需要一个例子,代码如下:
 
  <!--p
  //首先顶一个函数,这个函数需要接受两个参数,并且返回值是一定的
  //第一个参数等于第二个参数的时候返回0,小于的时候返回-1,大于返回1
   
  function cmp($a,$b){
   $a+=1;
   $b+=3;//改变这些值之后进行比较
   
   if($a==$b) return 0;
   return ($a<$b)?-1:1;
  }
   
  $a =array(1,4,3,5);
  uasort($a,'cmp');
  var_dump($a);
  -->  
  //输出结果:
  array(4) {
    [0]=>
    int(1)
    [3]=>
    int(5)
    [1]=>
    int(4)
    [2]=>
    int(3)
  }
  多维数组的排序
 
  例如array_multisort($a,$b),$a,$b是两个数组,如果排序之后,$a数组的第3个元素被排到了第一位,那么$b的第三个元素不管他在$b中的大小都会排在第一位,看看下边的程序运行结果,代码如下:
 
  <?php  
  $a =array(100,80,50,10,0);
  $b = array("c","f","q","e","z");
  array_multisort($a,$b);
  var_dump($a);
  var_dump($b);
  ?>  
  //运行结果:
  array(5) { [0]=> int(0) [1]=> int(10) [2]=> int(50) [3]=> int(80) [4]=> int(100) }
  array(5) { [0]=> string(1) “z” [1]=> string(1) “e” [2]=> string(1) “q” [3]=> string(1) “f” [4]=> string(1) “c” }
  很显然本来是数组b第五个元素的z被排到了第一位!
 
  其实说明白了就是,array_multisort()先把第一个数组按照键值的大小排序,然后其它数组都按照第一个数组的调整策略进行调整——第三个元素放到第一位,第二个元素放到第二位……——其实这个多维数组排序算法的最基本体现!
 
  不过需要注意的是:两个数组的元素个数必须相同,不然就会出现一个警告信息:
 
  Warning: array_multisort() [function.array-multisort]: Array sizes are inconsistent in ……
 
  好了,希望上边的大家也能用上,咱们还是说主要的吧:array_multisort()对多维数组进行排序,这个功能将来做项目的时候是非常有用的!
 
  首先我们看看对多维数组的每一元素[数组]进行排序的操作方法,很简单,但是有几个参数需要说明一下,如果您对sql有所了解一看估计就明白了,代码如下:
 
  <?php
  //让我们来构造一个多维数组
  $a=array(100,2,4,7,7);
  $b=array('ab','ac','ad','ag','ap');
   
  $ab = array($a,$b);
  //开始排序
  array_multisort($ab[0],SORT_NUMERIC,SORT_DESC,$ab[1],SORT_STRING,SORT_ASC);
  print_r($ab);
  ?>
  说明一下:首先我们用SORT_NUMERIC来声明对$ab[0]用数字类型排序,用SORT_DESC声明顺序是逆序(从大到小),然后我们对$ab[1]用字符串类型排序,顺序是升序(顺序)最后数组$ab的排序结果是两者的结合,先按$ab[0]的逆序,如果$ab[0]中存在大小相同的数值则按照$ab[1]的顺序排列,输出结果如下:
 
  Array (
  [0] => Array ( [0] => 100 [1] => 7 [2] => 7 [3] => 4 [4] => 2 )
  [1] => Array ( [0] => ab [1] => ag [2] => ap [3] => ad [4] => ac )
  )
  是不是很像在数据库中用order by?其实真的差不多!现在我们再看一个更加贴近实际应用的例子,代码如下:
 
  <?php  
  $array[] = array("age"=>20,"name"=>"li");
  $array[] = array("age"=>21,"name"=>"ai");
  $array[] = array("age"=>20,"name"=>"ci");
  $array[] = array("age"=>22,"name"=>"di");
   
  foreach ($array as $key=>$value){
   $age[$key] = $value['age'];
   $name[$key] = $value['name'];
  }
   
  array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$array);
  print_r($array);
  ?>
  这个例子的$array[]数组,是按照数据库中读出的记录来构造的,我们现在对他们按照年龄从大到小的顺序排列,如果年龄相同就按照名字的顺序排序,这样的排序才是我们将来会经常用的到的,因为array_multisort()需要的排序参数必须是一个列,所以我们用foreach把这个数组的年龄和姓名读出来,之后呢?
 
  就像上边的例子一样,进行排序,最后一个参数$array想必大家也看见了,是的这里需要声明对哪个数组进行排序,因为我们前边两个参数在形式上已经和需要排序的PHP数组没有关系了,虽然其实他们就是$array中的数据——我们从$array中抽取的列——排序当然是需要列,还没见过用行数据进行排序的呢!

(编辑:怀化站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读