排序

排序规则
  • SORT_REGULAR - 正常比较单元(不改变类型)
  • SORT_NUMERIC - 单元被作为数字来比较
  • SORT_STRING - 单元被作为字符串来比较
  • SORT_LOCALE_STRING - 根据当前的区域(locale)设置来把单元当作字符串比较,可以用 setlocale() 来改变。
  • SORT_NATURAL - 和 natsort() 类似对每个单元以"自然的顺序"对字符串进行排序。 PHP 5.4.0 中新增的。
  • SORT_FLAG_CASE - 能够与 SORT_STRING 或 SORT_NATURAL 合并(OR 位运算),不区分大小写排序字符串。
理解
  • SORT_REGULAR 是按照标准ASCII码排序的,不改变类型,注意这里都是字符,比如'1','2'
  • SORT_NUMERIC 是按照数字来比较
  • SORT_STRING 是按照字符串来比较
  • SORT_LOCALE_STRING 根据当前的区域(locale)设置来把单元当作字符串比较(基本不用)
  • SORT_NATURAL 对每个单元以"自然的顺序"对字符串进行排序,可以理解为,先根据首字母ASCII排序,然后第二个,第三个,依次类推,如果遇到数字,将会把数字部分整体排序,而不是一个个
  • SORT_FLAG_CASE 与 SORT_STRING 或 SORT_NATURAL 联合使用,不区分大小写排序字符串
sort — 对数组升序排序
语法

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

描述
  • 本函数对数组进行排序。当本函数结束时数组单元将被从最低到最高重新安排
  • 此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序
参数
参数 描述
array 要排序的数组
sort_flags 改变排序的行为
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例1-SORT_REGULAR 默认的正常排序-纯数字
$a = [12, 34, 56, 29, 90, 54];
$result = sort($a);
print_r($a);
// 结果
Array
(
    [0] => 12
    [1] => 29
    [2] => 34
    [3] => 54
    [4] => 56
    [5] => 90
)
// 示例2-SORT_REGULAR 默认的正常排序-纯字母/字符,可以看出默认是按ASCII码排序的
$a = ['b', 'a', '/', 'z', 'H', 'A', 'B', '\\', '<', '_', '0', '1', '2'];
$result = sort($a);
print_r($a);
// 结果
Array
(
    [0] => /
    [1] => 0
    [2] => 1
    [3] => 2
    [4] => <
    [5] => A
    [6] => B
    [7] => H
    [8] => \
    [9] => _
    [10] => a
    [11] => b
    [12] => z
)
// 示例3-SORT_REGULAR 默认的正常排序-字符+中文
$a = ['无敌', '字符', 'a', 'ab', 'b', '30', '301', '张三', '李四', '王二', '麻子'];
$result = sort($a);
print_r($a);
// 结果
Array
(
    [0] => 30
    [1] => 301
    [2] => a
    [3] => ab
    [4] => b
    [5] => 字符
    [6] => 张三
    [7] => 无敌
    [8] => 李四
    [9] => 王二
    [10] => 麻子
)
// 示例4-SORT_REGULAR 默认的正常排序-中文
$a = ['测试', '什么', '情况', '可以', '很好', '非常牛'];
$result = sort($a); // 结果 Array ( [0] => 什么 [1] => 可以 [2] => 很好 [3] => 情况 [4] => 测试 [5] => 非常牛 )
print_r($a);
// 结果
Array
(
    [0] => 什么
    [1] => 可以
    [2] => 很好
    [3] => 情况
    [4] => 测试
    [5] => 非常牛
)
// 示例5-SORT_NUMERIC 按照数字来比较-数字/数字字符
$a = [1, '1', 2, '21', 89, '76', true, false, null];
$result = sort($a, SORT_NUMERIC);
print_r($a);
// 结果
Array
(
    [0] => 
    [1] => 
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 2
    [6] => 21
    [7] => 76
    [8] => 89
)
// 示例6-SORT_STRING 按照字符串来比较-字符串
$a = ['1', 10, '99', '76', '102', 38, '45'];
$result = sort($a,SORT_STRING);
print_r($a);
// 结果
Array
(
    [0] => 1
    [1] => 10
    [2] => 102
    [3] => 38
    [4] => 45
    [5] => 76
    [6] => 99
)
// 示例7-SORT_LOCALE_STRING 根据当前的区域(locale)设置来把单元当作字符串比较,可以用 setlocale() 来改变
$a = ['20', '201', 1, '5', 6];
$result = sort($a, SORT_LOCALE_STRING);
print_r($a);
// 结果
Array
(
    [0] => 1
    [1] => 20
    [2] => 201
    [3] => 5
    [4] => 6
)
// 示例8-SORT_NATURAL 对每个单元以"自然的顺序"对字符串进行排序,区分大小写的
$a = ["Orange1", "orange2", "Orange3", "orange20"];
$result = sort($a, SORT_NATURAL);
print_r($a);
// 结果
Array
(
    [0] => Orange1
    [1] => Orange3
    [2] => orange2
    [3] => orange20
)
// 示例9-SORT_FLAG_CASE 与 SORT_STRING 或 SORT_NATURAL 联合使用,不区分大小写排序字符串
$a = ["Orange1d", "orange2c", "Orange3b", "orange20a"];
$result = sort($a, SORT_NATURAL | SORT_FLAG_CASE);
print_r($a);
// 结果
Array
(
    [0] => Orange1d
    [1] => orange2c
    [2] => Orange3b
    [3] => orange20a
)

rsort — 对数组逆向排序
语法

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

描述
  • 本函数对数组进行逆向排序(最高到最低)。
参数
参数 描述
array 输入的数组
sort_flags sort_flags 改变排序的行为,详情见 sort()
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$a = [12, 34, 56, 29, 90, 54];
$result = rsort($a);
print_r($a);
// 结果
Array
(
    [0] => 90
    [1] => 56
    [2] => 54
    [3] => 34
    [4] => 29
    [5] => 12
)

asort — 对数组进行排序并保持索引关系
语法

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

描述
  • 本函数对数组进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。
参数
参数 描述
array 输入的数组
sort_flags sort_flags 改变排序的行为,详情见 sort()
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$a = [12, 34, 56, 29, 90, 54];
$result = asort($a);
print_r($a);
// 结果
Array
(
    [0] => 12
    [3] => 29
    [1] => 34
    [5] => 54
    [2] => 56
    [4] => 90
)

arsort — 对数组进行逆向排序并保持索引关系
语法

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

描述
  • 本函数对数组进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。
参数
参数 描述
array 输入的数组
sort_flags sort_flags 改变排序的行为,详情见 sort()
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
$a = [12, 34, 56, 29, 90, 54];
$result = arsort($a);
print_r($a);
// 结果
Array
(
    [4] => 90
    [2] => 56
    [5] => 54
    [1] => 34
    [3] => 29
    [0] => 12
)

ksort — 对数组按照键名排序
语法

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

描述
  • 对数组按照键名排序,保留键名到数据的关联。本函数主要用于关联数组
参数
参数 描述
array 输入的数组
sort_flags sort_flags 改变排序的行为,详情见 sort()
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$a = [4=>12, 2=>34, 6=>56, 10=>29, 1=>90, 3=>54];
$result = ksort($a);
print_r($a);
// 结果
Array
(
    [1] => 90
    [2] => 34
    [3] => 54
    [4] => 12
    [6] => 56
    [10] => 29
)

krsort — 对数组按照键名逆向排序
语法

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

描述
  • 对数组按照键名逆向排序,保留键名到数据的关联。主要用于结合数组
参数
参数 描述
array 输入的数组
sort_flags sort_flags 改变排序的行为,详情见 sort()
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$a = [4=>12, 2=>34, 6=>56, 10=>29, 1=>90, 3=>54];
$result = krsort($a);
print_r($a); 
// 结果
Array
(
    [10] => 29
    [6] => 56
    [4] => 12
    [3] => 54
    [2] => 34
    [1] => 90
)

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

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

描述
  • 本函数将用用户自定义的比较函数对一个数组中的值进行排序。如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。
  • 如果两个成员比较结果相同,则它们在排序后的数组中的顺序未经定义
  • 此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序
参数
参数 描述
array 输入的数组
cmp_function 在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。int callback ( mixed $a, mixed $b )
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例1-简单使用
$a = [3, 2, 5, 6, 1];
$result = usort($a, function ($v1, $v2) {
     if ($v1 > $v2) {
         return 1;
     } else if ($v1 == $v2) {
         return 0;
     } else if ($v1 < $v2){
         return -1;
     }
});
print_r($a); 
// 结果
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 5
    [4] => 6
)
// 示例2-比较复杂的用法,这里实现了根据二维数组的某个列进行排序
$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'));
print_r($array);
foreach ($array as $item) {
   echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}
// 结果
Array
(
    [0] => Array
        (
            [key_a] => y
            [key_b] => a
        )

    [1] => Array
        (
            [key_a] => x
            [key_b] => b
        )

    [2] => Array
        (
            [key_a] => z
            [key_b] => c
        )

)
y, a
x, b
z, c
// 示例3-上面结果是回调函数,下面不用回调
$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');
$key = 'key_b';
usort($array, function ($a, $b) use ($key) {
   return strnatcmp($a[$key], $b[$key]);
});
print_r($array);
// 结果
Array
(
    [0] => Array
        (
            [key_a] => y
            [key_b] => a
        )

    [1] => Array
        (
            [key_a] => x
            [key_b] => b
        )

    [2] => Array
        (
            [key_a] => z
            [key_b] => c
        )

)
// 示例4-应用场景,有一个二维数组,需要根据name排序
$array[] = ['id'=>2,'name'=>'张三'];
$array[] = ['id'=>1,'name'=>'李四'];
$array[] = ['id'=>3,'name'=>'麻子'];
$array[] = ['id'=>5,'name'=>'王五'];
$array[] = ['id'=>10,'name'=>'实物'];
$key = 'id';
usort($array, function ($a, $b) use ($key) {
    return strnatcmp($a[$key], $b[$key]);
});
        print_r($array);
// 结果
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 李四
        )

    [1] => Array
        (
            [id] => 2
            [name] => 张三
        )

    [2] => Array
        (
            [id] => 3
            [name] => 麻子
        )

    [3] => Array
        (
            [id] => 5
            [name] => 王五
        )

    [4] => Array
        (
            [id] => 10
            [name] => 实物
        )

)

uksort — 使用用户自定义的比较函数对数组中的键名进行排序
语法

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

描述
  • uksort() 函数将使用用户提供的比较函数对数组中的键名进行排序
  • 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数
参数
参数 描述
array 输入的数组
cmp_function 在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。int callback ( mixed $a, mixed $b )
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$a = array("John" => 1, "the Earth" => 2, "an apple" => 3, "a banana" => 4);
uksort($a, function ($a, $b) {
    $a = preg_replace('@^(a|an|the) @', '', $a);
    $b = preg_replace('@^(a|an|the) @', '', $b);
    return strcasecmp($a, $b);
});
foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
// 结果
an apple: 3
a banana: 4
the Earth: 2
John: 1

uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
语法

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

描述
  • 本函数对数组排序并保持索引和单元之间的关联
  • 主要用于对那些单元顺序很重要的结合数组进行排序。比较函数是用户自定义的
参数
参数 描述
array 输入的数组
cmp_function 在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。int callback ( mixed $a, mixed $b )
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
uasort($array, function ($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
});
print_r($array);
// 示例
Array
(
    [d] => -9
    [h] => -4
    [c] => -1
    [e] => 2
    [g] => 3
    [a] => 4
    [f] => 5
    [b] => 8
)

natsort — 用"自然排序"算法对数组排序
语法

bool natsort( array &$array)

描述
  • 本函数实现了一个和人们通常对字母数字字符串进行排序的方法一样的排序算法并保持原有键/值的关联,这被称为"自然排序"。本算法和通常的计算机字符串排序算法(用于 sort())的区别见下面示例
参数
参数 描述
array 输入的 array
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$a = ["Orange1", "orange2", "Orange3", "orange20"];
$result = natsort($a);
print_r($a);
// 结果
Array
(
    [0] => Orange1
    [2] => Orange3
    [1] => orange2
    [3] => orange20
)

natcasesort — 用"自然排序"算法对数组进行不区分大小写字母的排序
语法

bool natcasesort( array &$array)

描述
  • natcasesort() 是 natsort() 函数的不区分大小写字母的版本
  • 本函数实现了一个和人们通常对字母数字字符串进行排序的方法一样的排序算法并保持原有键/值的关联,这被称为"自然排序"
参数
参数 描述
array 输入的 array
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例
$a = ["Orange1", "orange2", "Orange3", "orange20"];
$result = natcasesort($a);
print_r($a);
// 结果
Array
(
    [0] => Orange1
    [1] => orange2
    [2] => Orange3
    [3] => orange20
)

array_multisort — 对多个数组或多维数组进行排序
语法

bool array_multisort( array &$arr[, mixed $arg = SORT_ASC[, mixed $arg = SORT_REGULAR[, mixed $...]]] )

描述
  • array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序
  • 关联(string)键名保持不变,但数字键名会被重新索引
  • 排序顺序标志: ◦ SORT_ASC - 按照上升顺序排序 ◦ SORT_DESC - 按照下降顺序排序
  • 排序类型标志: ◦ SORT_REGULAR - 将项目按照通常方法比较 ◦ SORT_NUMERIC - 将项目按照数值比较 ◦ SORT_STRING - 将项目按照字符串比较
  • 每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR
  • 输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推
  • 本函数的参数结构有些不同寻常,但是非常灵活。第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志
参数
参数 描述
array 要排序的一个 array
arg 接下来的每个参数可以是另一个 array 或者是为之前 array 排序标志选项参数: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING
... ...
返回值
  • 成功时返回 TRUE, 或者在失败时返回 FALSE
举例
// 示例1-输入数组被当成一个表的列并以行来排序,意思是第一个数组的第一项,第二个数组的第一项,.....第n个数组的第一项,组成一个行记录,排序的时候是行之间的排序调整.第二行,第三行......依次类推。
$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);
print_r($ar1);
print_r($ar2);
// 结果
Array
(
    [0] => 0
    [1] => 10
    [2] => 100
    [3] => 100
)
Array
(
    [0] => 4
    [1] => 1
    [2] => 2
    [3] => 3
)
// 示例2-排序多维数组,当按第一个排序以后,如果第一个中有相同的元素值,那么相同元素值对应的元素,将会按照第二个数组指定的排序方式进行排序
$ar = array(
   array("10", 11, 100, 100, "a", 'b','c'),
   array(1, 2, "2", 3, 1, 10,11)
);
array_multisort($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC);
var_dump($ar);
// 结果
array(2) {
  [0]=>
  array(7) {
    [0]=>
    string(2) "10"
    [1]=>
    int(100)
    [2]=>
    int(100)
    [3]=>
    int(11)
    [4]=>
    string(1) "a"
    [5]=>
    string(1) "b"
    [6]=>
    string(1) "c"
  }
  [1]=>
  array(7) {
    [0]=>
    int(1)
    [1]=>
    int(3)
    [2]=>
    string(1) "2"
    [3]=>
    int(2)
    [4]=>
    int(1)
    [5]=>
    int(10)
    [6]=>
    int(11)
  }
}
// 分析,本例中在排序后,第一个数组将变成 "10",100,100,11,"a"(被当作字符串以升序排列)。第二个数组将包含 1, 3, "2", 2, 1(被当作数字以降序排列)
// 示例3-对数据库结果进行排序
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

// 取得列的列表
$volume = [];
$edition = [];
foreach ($data as $key => $row) {
     $volume[$key] = $row['volume'];
     $edition[$key] = $row['edition'];
}

// 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
print_r($data);
// 结果
Array
(
    [0] => Array
        (
            [volume] => 98
            [edition] => 2
        )

    [1] => Array
        (
            [volume] => 86
            [edition] => 1
        )

    [2] => Array
        (
            [volume] => 86
            [edition] => 6
        )

    [3] => Array
        (
            [volume] => 85
            [edition] => 6
        )

    [4] => Array
        (
            [volume] => 67
            [edition] => 2
        )

    [5] => Array
        (
            [volume] => 67
            [edition] => 7
        )

)
// 示例4-不区分大小写字母排序,SORT_STRING 和 SORT_REGULAR 都是区分大小写字母的,大写字母会排在小写字母之前
// 要进行不区分大小写的排序,就要按照原数组的小写字母拷贝来排序
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array);
print_r($array_lowercase); // Array ( [0] => alpha [1] => atomic [2] => beta [3] => bank )
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);
print_r($array);
// 结果
Array
(
    [0] => alpha
    [1] => atomic
    [2] => beta
    [3] => bank
)
Array
(
    [0] => Alpha
    [1] => atomic
    [2] => bank
    [3] => Beta
)
// 示例5-具体排序的一个例子
$grade = [
     "score" => [70, 95, 70.0, 60, "70"],
     "name" => ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Liu Qi"]
];
array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC, // 将分数作为数值,由高到低排序
        $grade["name"], SORT_STRING, SORT_ASC);
// 将名字作为字符串,由小到大排序
var_dump($grade);
// 结果
array(2) {
  ["score"]=>
  array(5) {
    [0]=>
    int(95)
    [1]=>
    string(2) "70"
    [2]=>
    float(70)
    [3]=>
    int(70)
    [4]=>
    int(60)
  }
  ["name"]=>
  array(5) {
    [0]=>
    string(5) "Li Si"
    [1]=>
    string(6) "Liu Qi"
    [2]=>
    string(7) "Wang Wu"
    [3]=>
    string(9) "Zhang San"
    [4]=>
    string(8) "Zhao Liu"
  }
}

results matching ""

    No results matching ""