PHP數組array_multisort排序詳解


今天特意再看了下官網的介紹,對它的多個數組的排序還是每台理解,找了些資料深入理解了下,在此總結下。

PHP中array_multisort函數對多個數組或多維數組進行排序,關聯(string)鍵名保持不變,但數字鍵名會被重新索引。 
輸入數組被當成一個表的列並以行來排序——這類似於 SQL 的 ORDER BY 子句的功能。第一個數組是要排序的主要數組。數組中的行(值)比較為相同的話就按照下一個輸入數組中相應值的大小來排序,依此類推。——這句話是理解此函數用法的關鍵。

第一個參數必須是一個數組。接下來的每個參數可以是數組或者是下面列出的排序標志。

排序順序標志: 
■SORT_ASC - 按照上升順序排序 
■SORT_DESC - 按照下降順序排序

排序類型標志: 
■SORT_REGULAR - 將項目按照通常方法比較 
■SORT_NUMERIC - 將項目按照數值比較 
■SORT_STRING - 將項目按照字符串比較

每個數組之后不能指定兩個同類的排序標志。每個數組后指定的排序標志僅對該數組有效 - 在此之前為默認值 SORT_ASC 和 SORT_REGULAR。

參數數組被當成一個表的列並以行來排序——這類似於 SQL 的 ORDER BY 子句的功能。第一個數組是要排序的主要數組。數組中的行(值)比較為相同的話就按照下一個輸入數組中相應值的大小來排序,依此類推。注意:作為參數的數組元素個數應保持一致,否則會報錯。

先看一個對多個數組進行排序的例子。

<?php

$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 )
*/

再來個一次對多個數組進行排序:

$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 )

對多維數組(以二位數組為例)進行排序:

$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))

理解有限.......可能有描述不正之處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM