zoukankan      html  css  js  c++  java
  • 关于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
    )
    

    以上,整个函数运行完毕,顺利的到理想结果。

    虽然对大神来说有点小儿科,但是跑通这个函数,还是充满了兴奋!

  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/leekale/p/4662736.html
Copyright © 2011-2022 走看看