最近學習遇到自定義數組排序函數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 )
以上,整個函數運行完畢,順利的到理想結果。
雖然對大神來說有點小兒科,但是跑通這個函數,還是充滿了興奮!