關於PHP中usort()函數的解讀


  最近學習遇到自定義數組排序函數usort()有些不了解,搜了很多地方都沒有很好的解釋,自己研究好久,發來與和我一樣的初學者共享~ 

bool usort ( array &$array , callable $cmp_function )

  函數為對數組進行自己自定義排序,排序規則由 $cmp_function 定義。返回值為ture 或者false。

現在先對簡單的一個函數進行分析:

1 <?php
2 function re($a,$b){
3     return ($a<$b)?1:-1;
4 }
5 $x=array(1,3,2,5,9);
6 usort($x, 're');
7 print_r($x);
8 ?>

打印結果為:

Array(
    [0] => 9
    [1] => 5
    [2] => 3
    [3] => 2
    [4] => 1
)

實現了數組的倒序排列。分析如下:

  usort兩兩提取數組中的數值,並按順序輸入自定義函數中,自定義函數根據內容返回1或者-1;usort根據返回值為1或者-1,得到傳入的數值1“大於”或者“小於”數值2,然后對數值進行從小到大的排序。即:返回值為1,說明數值1“大於”數值2,然后排序:數值2—>數值1;返回值為-1,說明數值1“小於”數值2,然后排序:數值1->數值2。

  上面自定義函數中,$a<$b如果正確返回1,說明$a"大於"$b,則按照順序$b->$a來排序;如果錯誤返回-1,說明說明$a"小於"$b,則按照順序$a->$b來排序。

  下面進行一個較為復雜的排序:對一個數組先奇后偶,然后再進行從大到小排序。

 1 function Compare($str1, $str2) {
 2     if (($str1 % 2 == 0) && ($str2 %2 == 0)) {
 3         if ($str1 > $str2)
 4             return - 1;
 5         else
 6             return 1;
 7     }
 8     if ($str1 % 2 == 0)
 9         return 1;
10     if ($str2 % 2 == 0)
11         return -1;
12     return ($str2 > $str1) ? 1 : - 1;
13 }
14 $scores = array (22,57,55,12,87,56,54,11);
15 usort ( $scores, 'Compare' );
16 print_r ( $scores );

實現步驟為:

1》判斷輸入的兩個值是否都為偶數,都為偶數,進行從大到小排序;

2》如果不都為偶數,則至少一個為奇數,先判斷$str1是否為偶數,如果為偶數,即:if($str1%2==0)成立,則返回1,意味着$str1“大於”$str2,則usort函數進行排序為“小的”$str2->“大的”$str1(偶數);

3》如果$str1為奇數,上面不返回任何值,接着判斷$str2是否為偶數,如果為偶數,則返回-1,意味着$str1“小於”$str2,則usort函數進行排序為“小的”$str1(奇數)->“大的”$str2(偶數);

4》如果兩個值都為奇數,則上面不返回任何值,接着對$str1和$str2進行從大到小排序;

輸出結果為:

Array(
    [0] => 87
    [1] => 57
    [2] => 55
    [3] => 11
    [4] => 56
    [5] => 54
    [6] => 22
    [7] => 12
)

以上,整個函數運行完畢,順利的到理想結果。

雖然對大神來說有點小兒科,但是跑通這個函數,還是充滿了興奮!

 


免責聲明!

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



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