zoukankan      html  css  js  c++  java
  • PHP数组排序函数有哪些

    PHP数组排序函数有哪些

    一、总结

    一句话总结:其实也就是是否保持索引,对键排序还是对值排序,除了sort,rsort.shuffle,usort外,都是保持索引的

    是否保持索引 键排序 值排序
    除了sort,rsort.shuffle,usort外,都是保持索引的

      1、a(association)前缀表示以键值关联排序;
      2、k(key)前缀表示以键名关联排序;
      3、r(reverse)前缀表示以反方向排序。

    排序函数属性
    函数名称排序依据数组索引键保持排序的顺序相关函数
    array_multisort() 键值关联的保持,数字类型的不保持 第一个数组或者由选项指定 array_walk()
    asort() 由低到高 arsort()
    arsort() 由高到低 asort()
    krsort() 由高到低 ksort()
    ksort() 由低到高 asort()
    natcasesort() 自然排序,大小写不敏感 natsort()
    natsort() 自然排序 natcasesort()
    rsort() 由高到低 sort()
    shuffle() 随机 array_rand()
    sort() 由低到高 rsort()
    uasort() 由用户定义 uksort()
    uksort() 由用户定义 uasort()
    usort() 由用户定义 uasort()
     

    1、排序sort函数中的前缀a/k/r/u分别代表什么意思?

    a-association k-key r-reverse u-user

      1、a(association)前缀表示以键值关联排序;
      2、k(key)前缀表示以键名关联排序;
      3、r(reverse)前缀表示以反方向排序。

    二、PHP 数组排序函数sort,rsort,ksort,krsort,asort,arsort区别

    参考:PHP 数组排序函数sort,rsort,ksort,krsort,asort,arsort区别 - TimeStory - 博客园
    https://www.cnblogs.com/TimeStory/p/4201385.html

    一、概念:
        1、自然排序法:即按自然数的大小排序,例如“10>2”;
        2、计算机标准排序法:是以逐个字符比较,排序,例如“2>10”(因为第一位2>1);
        3、数值数组:带有数字 ID 键的数组;
        4、关联数组:带有指定的键的数组,每个键关联一个值。
        5、默认的排序为按键值升序排序,排序方式为自然排序。

    二、【帮助理解】
      1、a(association)前缀表示以键值关联排序;
      2、k(key)前缀表示以键名关联排序;
      3、r(reverse)前缀表示以反方向排序。

    三、排序
    例子:

    1     $arr = array("Ben"=>"2","peter"=>"10","Joe"=>"30");
    2     echo "-------------echo array-------------<br>";
    3     foreach ($arr as $key => $value) {
    4         # code...
    5         echo "key= ".$key.",value= ".$value."<br>";
    6     }

    1、排序数值数组:
      1)、sort:默认的排序,即按键值升序排序,因为该函数用于排序一维数组,所有排序出来的键名会被重新规定,关联数组用此方法排序,则关联数组的键名不被保留换成的是数字键
      2)、rsort:该函数与sort函数用法类似,不同的是按键值逆序排序。

     1     echo "-------------sorts by sort-------------<br>";
     2     sort($arr);
     3     foreach ($arr as $key => $value) {
     4         # code...
     5         echo "key= ".$key.",value= ".$value."<br>";
     6     }
     7 
     8     echo "-------------sorts by rsort-------------<br>";
     9     rsort($arr);
    10     foreach ($arr as $key => $value) {
    11         # code...
    12         echo "key= ".$key.",value= ".$value."<br>";
    13     }

    输出结果:
    -------------echo array-------------
    key= Ben,value= 2
    key= peter,value= 10
    key= Joe,value= 30
    -------------sorts by sort-------------
    key= 0,value= 2
    key= 1,value= 10
    key= 2,value= 30
    -------------sorts by rsort-------------
    key= 0,value= 30
    key= 1,value= 10
    key= 2,value= 2

    2、排序关联数组:
    关联数组的排序有两种排序项,第一种以数组的键名排序,第二种以数组的键值排序。
        按键名排序:
            1)、ksort:按关联数组的键名升序排序,排序的结果保留键值的关联关系。
            2)、krsort:按关联数组的键名逆序排序,排序的结果保留键值的关联关系。

     1     echo "-------------sorts by ksort--------------<br>";
     2     ksort($arr);
     3     foreach ($arr as $key => $value) {
     4         # code...
     5         echo "key= ".$key.",value= ".$value."<br>";
     6     }
     7 
     8     echo "-------------sorts by krsort-------------<br>";
     9     krsort($arr);
    10     foreach ($arr as $key => $value) {
    11         # code...
    12         echo "key= ".$key.",value= ".$value."<br>";
    13     }

     输出结果:
    -------------echo array-------------
    key= Ben,value= 2
    key= peter,value= 10
    key= Joe,value= 30
    -------------sorts by ksort--------------
    key= Ben,value= 2
    key= Joe,value= 30
    key= peter,value= 10
    -------------sorts by krsort-------------
    key= peter,value= 10
    key= Joe,value= 30
    key= Ben,value= 2  

      按键值排序:
            1)、asort:按关联数组的键值升序排序,排序的结果保留键值的关联关系
            2)、arsort:按关联数组的键值逆序排序,排序的结果保留键值的关联关系。

     1     echo "-------------sorts by asort-------------<br>";
     2     asort($arr);
     3     foreach ($arr as $key => $value) {
     4         # code...
     5         echo "key= ".$key.",value= ".$value."<br>";
     6     }
     7 
     8     echo "-------------sorts by arsort-------------<br>";
     9     arsort($arr);
    10     foreach ($arr as $key => $value) {
    11         # code...
    12         echo "key= ".$key.",value= ".$value."<br>";
    13     }

    输出结果:
    -------------echo array-------------
    key= Ben,value= 2
    key= peter,value= 10
    key= Joe,value= 30
    -------------sorts by asort-------------
    key= Ben,value= 2
    key= peter,value= 10
    key= Joe,value= 30
    -------------sorts by arsort-------------
    key= Joe,value= 30
    key= peter,value= 10
    key= Ben,value= 2

     

    三、用户自定义排序函数

    参考:PHP: 对数组进行排序 - Manual
    https://www.php.net/manual/zh/array.sorting.php

    PHP 有一些用来排序数组的函数, 这个文档会把它们列出来。

    主要区别有:

    • 有些函数基于 array 的键来排序, 而其他的基于值来排序的:$array['key'] = 'value';
    • 排序之后键和值之间的关联关系是否能够保持, 是指排序之后数组的键可能 会被重置为数字型的(0,1,2 ...)。
    • 排序的顺序有:字母表顺序, 由低到高(升序), 由高到低(降序),数字排序,自然排序,随机顺序或者用户自定义排序。
    • 注意:下列的所有排序函数都是直接作用于数组本身, 而不是返回一个新的有序的数组。
    • 以下函数对于数组中相等的元素,它们在排序后的顺序是未定义的。 (也即相等元素之间的顺序是不稳定的)。
    排序函数属性
    函数名称排序依据数组索引键保持排序的顺序相关函数
    array_multisort() 键值关联的保持,数字类型的不保持 第一个数组或者由选项指定 array_walk()
    asort() 由低到高 arsort()
    arsort() 由高到低 asort()
    krsort() 由高到低 ksort()
    ksort() 由低到高 asort()
    natcasesort() 自然排序,大小写不敏感 natsort()
    natsort() 自然排序 natcasesort()
    rsort() 由高到低 sort()
    shuffle() 随机 array_rand()
    sort() 由低到高 rsort()
    uasort() 由用户定义 uksort()
    uksort() 由用户定义 uasort()
    usort() 由用户定义 uasort()
     

    1、usort

    usort — 使用用户自定义的比较函数对数组中的值进行排序

    说明

    usort ( array &$array , callable $value_compare_func ) : bool

    本函数将用用户自定义的比较函数对一个数组中的值进行排序。 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。

    Note:

    If two members compare as equal, their relative order in the sorted array is undefined.

    Note此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。

    参数

    array

    输入的数组

    cmp_function

    在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。

    callback ( mixed $amixed $b ) : int
    Caution

    Returning non-integer values from the comparison function, such as float, will result in an internal cast to integer of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal.

    返回值

    成功时返回 TRUE, 或者在失败时返回 FALSE

     
    Example #2 使用多维数组的 usort() 例子
    
    <?php
    function cmp($a, $b)
    {
        return strcmp($a["fruit"], $b["fruit"]);
    }
    
    $fruits[0]["fruit"] = "lemons";
    $fruits[1]["fruit"] = "apples";
    $fruits[2]["fruit"] = "grapes";
    
    usort($fruits, "cmp");
    
    while (list($key, $value) = each($fruits)) {
        echo "$fruits[$key]: " . $value["fruit"] . "
    ";
    }
    ?>
    当排序多维数组时,$a$b 包含到数组第一个索引的引用。
    
    以上例程会输出:
    
    $fruits[0]: apples
    $fruits[1]: grapes
    $fruits[2]: lemons

    php闭包

    多维数组排序

    Example #4 usort() example using a closure to sort a multi-dimensional array
    
    <?php
    $array[0] = array('key_a' => 'z', 'key_b' => 'c');
    $array[1] = array('key_a' => 'x', 'key_b' => 'b');
    $array[2] = array('key_a' => 'y', 'key_b' => 'a');
    
    function build_sorter($key) {
        return function ($a, $b) use ($key) {
            return strnatcmp($a[$key], $b[$key]);
        };
    }
    
    usort($array, build_sorter('key_b'));
    
    foreach ($array as $item) {
        echo $item['key_a'] . ', ' . $item['key_b'] . "
    ";
    }
    ?>
    以上例程会输出:
    
    y, a
    x, b
    z, c
     
     
  • 相关阅读:
    字符串的排列
    二叉搜索树与双向链表
    复杂链表的复制
    二叉树中和为某一值的路径
    二叉搜索树的后序遍历序列
    从上往下打印二叉树
    python系统编程(一)
    python网络编程(十三)
    python网络编程(十二)
    python网络编程(十一)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/10646288.html
Copyright © 2011-2022 走看看