首先用实例来讲述一下PHP内置的一些排序函数

 

[a / k] sort [/ rsort]:[保留索引关系 / 按键名(保留键名关系,适用于关联数组)] 对数组进行排序,结束时数组单元将被从最低到最高 [/最高到最低] 排序。成功返回true,失败返回false

            bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )

            array : 要排序的数组

            sort_flags : 可选第二个参数,可以用以下值改变排序行为

  • SORT_REGULAR - 正常比较单元(不改变类型)
  • SORT_NUMERIC - 单元被作为数字来比较
  • SORT_STRING - 单元被作为字符串来比较                                       

   

<?php

/

  • @Author: Qy
  • @Date: 2018-11-26 17:07:26
  • @Last Modified by: Qy
  • @Last Modified time: 2018-11-26 17:19:27
    */

$sortArr = ['Za', 'z', 23, 'A', 22, 41, 18, 20, 'aZ', 12, 200303, 'b', 'C', 'bC', 2200, 1192];

sort($sortArr);
/ 0 => string 'A' (length=1)
1 => string 'C' (length=1)
2 => string 'Za' (length=2)
3 => string 'aZ' (length=2)
4 => string 'b' (length=1)
5 => string 'bC' (length=2)
6 => string 'z' (length=1)
7 => int 12
8 => int 18
9 => int 20
10 => int 22
11 => int 23
12 => int 41
13 => int 1192
14 => int 2200
15 => int 200303
/

sort(\(sortArr</span>, SORT_REGULAR); <span style="color: #008000;">//</span><span style="color: #008000;">正常比较单元(不改变类型)</span><span style="color: #008000;"> /*</span><span style="color: #008000;"> 0 =&gt; string 'A' (length=1) 1 =&gt; string 'C' (length=1) 2 =&gt; string 'Za' (length=2) 3 =&gt; string 'aZ' (length=2) 4 =&gt; string 'b' (length=1) 5 =&gt; string 'bC' (length=2) 6 =&gt; string 'z' (length=1) 7 =&gt; int 12 8 =&gt; int 18 9 =&gt; int 20 10 =&gt; int 22 11 =&gt; int 23 12 =&gt; int 41 13 =&gt; int 1192 14 =&gt; int 2200 15 =&gt; int 200303</span><span style="color: #008000;">*/</span> <span style="color: #008080;">sort</span>(<span style="color: #800080;">\)sortArr, SORT_NUMERIC); //单元作为数字比较
/
0 => string 'A' (length=1)
1 => string 'C' (length=1)
2 => string 'Za' (length=2)
3 => string 'aZ' (length=2)
4 => string 'b' (length=1)
5 => string 'bC' (length=2)
6 => string 'z' (length=1)
7 => int 12
8 => int 18
9 => int 20
10 => int 22
11 => int 23
12 => int 41
13 => int 1192
14 => int 2200
15 => int 200303
/
sort(\(sortArr</span>, SORT_STRING); <span style="color: #008000;">//</span><span style="color: #008000;">单元作为字符串比较</span><span style="color: #008000;"> /*</span><span style="color: #008000;">0 =&gt; int 1192 1 =&gt; int 12 2 =&gt; int 18 3 =&gt; int 20 4 =&gt; int 200303 5 =&gt; int 22 6 =&gt; int 2200 7 =&gt; int 23 8 =&gt; int 41 9 =&gt; string 'A' (length=1) 10 =&gt; string 'C' (length=1) 11 =&gt; string 'Za' (length=2) 12 =&gt; string 'aZ' (length=2) 13 =&gt; string 'b' (length=1) 14 =&gt; string 'bC' (length=2) 15 =&gt; string 'z' (length=1)</span><span style="color: #008000;">*/</span> <span style="color: #008080;">sort</span>(<span style="color: #800080;">\)sortArr, SORT_STRING); //单元作为字符串比较

 

natsort : 用 "自然排序" 算法对数组排序,成功返回true,失败返回false

          bool natsort ( array &$array )

          array : 要排序的数组

<?php

/

  • @Author: Qy
  • @Date: 2018-11-26 17:07:26
  • @Last Modified by: Qy
  • @Last Modified time: 2018-11-26 17:30:29
    */

\(array1</span> = <span style="color: #800080;">\)array2 = array("img12.png", "img10.png", "img2.png", "img1.png");

asort($array1);
/3 => string 'img1.png' (length=8)
1 => string 'img10.png' (length=9)
0 => string 'img12.png' (length=9)
2 => string 'img2.png' (length=8)
/

natsort($array2);
/3 => string 'img1.png' (length=8)
2 => string 'img2.png' (length=8)
1 => string 'img10.png' (length=9)
0 => string 'img12.png' (length=9)
/

 

natcasesort : 用 "自然排序" 算法对数组进行不区分大小写排序,成功返回true,失败返回false

          bool natsort ( array &$array )

          array : 要排序的数组

<?php

/

  • @Author: Qy
  • @Date: 2018-11-26 17:07:26
  • @Last Modified by: Qy
  • @Last Modified time: 2018-11-26 17:33:25
    */
    \(array1</span> = <span style="color: #800080;">\)array2 = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');

sort($array1);
/ 0 => string 'IMG0.png' (length=8)
1 => string 'IMG3.png' (length=8)
2 => string 'img1.png' (length=8)
3 => string 'img10.png' (length=9)
4 => string 'img12.png' (length=9)
5 => string 'img2.png' (length=8));
/

natcasesort($array2);
/ 0 => string 'IMG0.png' (length=8)
4 => string 'img1.png' (length=8)
3 => string 'img2.png' (length=8)
5 => string 'IMG3.png' (length=8)
2 => string 'img10.png' (length=9)
1 => string 'img12.png' (length=9)
/

 

strnat[case]cmp : 使用自然排序算法比较字符串区分大小写[不区分大小写],与其他字符串比较函数类似,如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 

         int strnatcmp ( string $str1 , string $str2 )

 

/**
 * @Author: Qy
 * @Date:   2018-11-26 17:07:26
 * @Last Modified by:   Qy
 * @Last Modified time: 2018-11-27 17:51:31
 */
//通常在自然算法中,数字 2 小于数字 10。而在计算机排序中,10 小于 2,这是因为 10 中的第一个数字小于 2
$str1 = "2.jpg";
$str2 = "10.jpg";
$str3 = "jb51.net_1";
$str4 = "JB51.NET_2";
echo strcmp($str1, $str2); //按字节进行比较,返回1
echo strcmp($str3,$str4);//按字节进行比较,返1
echo strnatcmp($str1,$str2);//按"自然排序"法进行比较,返回-1
echo strnatcmp($str3,$str4);//按"自然排序"法进行比较,返回1

 

 

 接着整理了基本的PHP排序方法 :  冒泡排序,快速排序,选择排序,插入排序

 

冒泡排序

//在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
即,每当两相邻的数比较后发现它们的排序与排序要求相反时,直到没有任何一对数字需要比较。就将它们互换。
冒泡排序其实上是和选择排序相比,并无明显差别。都是找到最小的,放到最左端。依次循环解决问题。
差别在于冒泡排序的交换位置的次数较多,而选择排序则是找到最小的元素的下标,然后直接和最左端的交换位置。
function order($arr = []) {
</span><span style="color: #800080;">$count</span> = <span style="color: #008080;">count</span>(<span style="color: #800080;">$arr</span><span style="color: #000000;">);

</span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$count</span> == 2<span style="color: #000000;">) {
    </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$arr</span>[0] &gt; <span style="color: #800080;">$arr</span>[1<span style="color: #000000;">]) {
        </span><span style="color: #800080;">$temp</span>   = <span style="color: #800080;">$arr</span>[0<span style="color: #000000;">];
        </span><span style="color: #800080;">$arr</span>[0] = <span style="color: #800080;">$arr</span>[1<span style="color: #000000;">];
        </span><span style="color: #800080;">$arr</span>[1] = <span style="color: #800080;">$temp</span><span style="color: #000000;">;
    }
} </span><span style="color: #0000ff;">elseif</span> (<span style="color: #800080;">$arr</span> &gt; 2<span style="color: #000000;">) {

    </span><span style="color: #008000;">//</span><span style="color: #008000;">外层控制排序轮次  需要冒泡的轮次</span>
    <span style="color: #0000ff;">for</span> (<span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> &lt; <span style="color: #800080;">$count</span> - 1; <span style="color: #800080;">$i</span>++<span style="color: #000000;">) {
        </span><span style="color: #008000;">//</span><span style="color: #008000;">内层控制每轮比较次数  冒出一个数 需要比较的次数 这里的-1意思是外层遍历当前元素往后的</span>
        <span style="color: #0000ff;">for</span> (<span style="color: #800080;">$j</span> = 0; <span style="color: #800080;">$j</span> &lt; <span style="color: #800080;">$count</span> - 1 - <span style="color: #800080;">$i</span>; <span style="color: #800080;">$j</span>++<span style="color: #000000;">) {
            </span><span style="color: #008000;">//</span><span style="color: #008000;">说明前面数比后面大,交换</span>
            <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$j</span>] &gt; <span style="color: #800080;">$arr</span>[<span style="color: #800080;">$j</span> + 1<span style="color: #000000;">]) {
                </span><span style="color: #800080;">$temp</span>        = <span style="color: #800080;">$arr</span>[<span style="color: #800080;">$j</span><span style="color: #000000;">];
                </span><span style="color: #800080;">$arr</span>[<span style="color: #800080;">$j</span>]     = <span style="color: #800080;">$arr</span>[<span style="color: #800080;">$j</span> + 1<span style="color: #000000;">];
                </span><span style="color: #800080;">$arr</span>[<span style="color: #800080;">$j</span> + 1] = <span style="color: #800080;">$temp</span><span style="color: #000000;">;
            }
        }
    }
}
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$arr</span><span style="color: #000000;">;

}
\(arr</span> = <span style="color: #0000ff;">array</span>(6, 3, 8, 2, 9, 1<span style="color: #000000;">); </span><span style="color: #800080;">\)res = order(\(arr</span><span style="color: #000000;">); </span><span style="color: #008080;">var_dump</span>(<span style="color: #800080;">\)res);