array_multisort—对多个数组或多维数组进行排序

案例一:
PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 

关联(string)键名保持不变,但数字键名会被重新索引。 
输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。——这句话是理解此函数用法的关键。

第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。

排序顺序标志: 
■SORT_ASC - 按照上升顺序排序 
■SORT_DESC - 按照下降顺序排序

排序类型标志: 
■SORT_REGULAR - 将项目按照通常方法比较 
■SORT_NUMERIC - 将项目按照数值比较 
■SORT_STRING - 将项目按照字符串比较

每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。

看看两个实际例子:

1、一次对多个数组进行排序:

$num1 = array(3, 5, 4, 3);
$num2 = array(27, 50, 44, 78);
array_multisort($num1, SORT_ASC, $num2, SORT_DESC);
print_r($num1);
print_r($num2);
//result: Array ( [0] => 3 [1] => 3 [2] => 4 [3] => 5 ) Array ( [0] => 78 [1] => 27 [2] => 44 [3] => 50 ) 

2、对多维数组(以二位数组为例)进行排序:

$arr = array(
     '0' => array(
          'num1' => 3,
          'num2' => 27 
      ),
     '1' => array(
          'num1' => 5,
          'num2' => 50
     ),     
     '2' => array(
         'num1' => 4,
         'num2' => 44
     ),
     '3' => array(
         'num1' => 3,
         'num2' => 78
     ) 
 ); 
 foreach ( $arr as $key => $row ){
     $num1[$key] = $row ['num1'];
     $num2[$key] = $row ['num2'];
 } 
array_multisort($num1, SORT_ASC, $num2, SORT_DESC, $arr);
print_r($arr);
//result:Array([0]=>Array([num1]=>3 [num2]=>78) [1]=>Array([num1]=>3 [num2]=>27) [2]=>Array([num1]=>4 [num2]=>44) [3]=>Array([num1]=>5 [num2]=>50))


案例二:
PHP中array_multisort函数对多个数组或多维数组进行排序,参数数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。注意:作为参数的数组元素个数应保持一致,否则会报错。
先看一个对多个数组进行排序的例子。

$array1 = array('one'=>'10','two'=>'20','three'=>'20','four'=>10);  
$array2 = array('one'=>'10','two'=>'30','three'=>'20','four'=>'1');  
$array3 = array('one'=>'C','two'=>'A','three'=>'B','four'=>'F');  
  
array_multisort($array1,$array2,$array3);  
print_r($array1);//Array ( [four] => 10 [one] => 10 [three] => 20 [two] => 20 )  
print_r($array2);//Array ( [four] => 1 [one] => 10 [three] => 20 [two] => 30 )  
print_r($array3);//Array ( [four] => F [one] => C [three] => B [two] => A )  


在上面的例子中,首先对第一个参数数组进行排序(默认所有数组升序排序),我们可以看出第一个数组中存在相同的值(键名‘one’和‘four’的键值相同,键名‘two’和‘three’的键值相同),所以在排序第一个数组的相同值时就按照下一个输入数组中相应值的大小来排序(第二个数组‘four’的值小于‘one’的值,因此four的值排在one的前面),依此类推。

在看一个,改变排序顺序的例子。


$array1 = array('one'=>'10','two'=>'20','three'=>'20','four'=>10);  
$array2 = array('one'=>'10','two'=>'30','three'=>'20','four'=>'1');  
$array3 = array('one'=>'C','two'=>'A','three'=>'B','four'=>'F');  
  
array_multisort($array1,SORT_DESC,$array2,SORT_ASC,$array3);  
print_r($array1);//Array ( [three] => 20 [two] => 20 [four] => 10 [one] => 10 )  
print_r($array2);//Array ( [three] => 20 [two] => 30 [four] => 1 [one] => 10 )  

print_r($array3);//Array ( [three] => B [two] => A [four] => F [one] => C )  


在这个例子中,第一个数组降序排序,碰到相同的值,按照第二个数组升序值进行排序。
注意:如果要是排序数组都是关联数组,则保留原有key名,若存在索引数组,则会按顺序重新建立索引。

$array1 = array('one'=>'10',2=>'20',3=>'20',4=>10);    
$array2 = array('one'=>'10','2'=>'30','3'=>'20','four'=>'1');    
$array3 = array('one'=>'C','2'=>'A','3'=>'B','four'=>'F');    
    
array_multisort($array1,$array2,$array3);    
  
print_r($array1); //Array ( [0] => 10 [one] => 10 [1] => 20 [2] => 20 )   
print_r($array2); //Array ( [four] => 1 [one] => 10 [0] => 20 [1] => 30 )   
print_r($array3); //Array ( [four] => F [one] => C [0] => B [1] => A )  


多维数组排序。
我们通常有一些多维数组需要排序:

$guys = array(  
    array('name'=>'jake', 'score'=>80, 'grade' =>'A'),  
    array('name'=>'jina', 'score'=>70, 'grade'=>'A'),  
    array('name'=>'john', 'score'=>70, 'grade' =>'A'),  
    array('name'=>'ben', 'score'=>20, 'grade'=>'B')  
);  
//例如我们想按成绩倒序排列,如果成绩相同就按名字的升序排列。  
//这时我们就需要根据$guys的顺序多弄两个数组出来:  
$scores = array(80,70,70,20);  
$names = array('jake','jina','john','ben');  
//然后  
array_multisort($scores, SORT_DESC, $names, $guys);  
  
foreach($guys as $v){  
    print_r($v);  
    echo "<br/>";  
}  
/* 
Array ( [name] => jake [score] => 80 [grade] => A ) 
Array ( [name] => jina [score] => 70 [grade] => A ) 
Array ( [name] => john [score] => 70 [grade] => A ) 
Array ( [name] => ben [score] => 20 [grade] => B ) 
*/  



案例三:

例如像下面的数组:
代码如下:

$users = array(
  array('name' => 'tom', 'age' => 20)
  , array('name' => 'anny', 'age' => 18)
  , array('name' => 'jack', 'age' => 22)
);

希望能按照age从小到大进行排序。笔者整理了两个方法出来,分享给大家。
1、使用array_multisort
使用这个方法,会比较麻烦些,要将age提取出来存储到一维数组里,然后按照age升序排列。具体代码如下:

代码如下:

$ages = array();
foreach ($users as $user) {
  $ages[] = $user['age'];
}

array_multisort($ages, SORT_ASC, $users);


执行后,$users就是排序好的数组了,可以打印出来看看。如果需要先按年龄升序排列,再按照名称升序排列,方法同上,就是多提取一个名称数组出来,最后的排序方法这样调用:
代码如下:

array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值