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)前缀表示以反方向排序。

三、排序
例子:

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

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

     echo "-------------sorts by sort-------------<br>";
sort($arr);
foreach ($arr as $key => $value) {
# code...
echo "key= ".$key.",value= ".$value."<br>";
} echo "-------------sorts by rsort-------------<br>";
rsort($arr);
foreach ($arr as $key => $value) {
# code...
echo "key= ".$key.",value= ".$value."<br>";
}

输出结果:
-------------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:按关联数组的键名逆序排序,排序的结果保留键值的关联关系。

     echo "-------------sorts by ksort--------------<br>";
ksort($arr);
foreach ($arr as $key => $value) {
# code...
echo "key= ".$key.",value= ".$value."<br>";
} echo "-------------sorts by krsort-------------<br>";
krsort($arr);
foreach ($arr as $key => $value) {
# code...
echo "key= ".$key.",value= ".$value."<br>";
}

输出结果:
-------------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:按关联数组的键值逆序排序,排序的结果保留键值的关联关系。

     echo "-------------sorts by asort-------------<br>";
asort($arr);
foreach ($arr as $key => $value) {
# code...
echo "key= ".$key.",value= ".$value."<br>";
} echo "-------------sorts by arsort-------------<br>";
arsort($arr);
foreach ($arr as $key => $value) {
# code...
echo "key= ".$key.",value= ".$value."<br>";
}

输出结果:
-------------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"] . "\n";
}
?>
当排序多维数组时,$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'] . "\n";
}
?>
以上例程会输出: y, a
x, b
z, c
 
 

PHP数组排序函数有哪些的更多相关文章

  1. php数组排序函数

    下边提到的几个数组函数的排序有一些共性: 1 数组被作为排序函数的参数,排序以后,数组本身就发生了改变,函数的返回值为bool类型.2 函数名中出现单a表示association,含义为,在按值排序的 ...

  2. 常用的php数组排序函数

    分享几个php数组排序函数,每个函数出去sort是排序的意思前缀字母的含义分别代表: a 索引 k 数组键 r 逆向 u 用户自定义 顺序排序函数 sort — 对数组排序  ksort — 对数组按 ...

  3. 一个不错的PHP二维数组排序函数简单易用存用

    一个不错的PHP二维数组排序函数简单易用存用 传入数组,传入排序的键,传入排序顺序 public function array_sort($arr,$keys,$type='asc') { $keys ...

  4. PHP的数组排序函数

    <?php class order{ /** * * 数组排序 * @param array $arr 例如: * array ( array ( 'deskId' => '460646' ...

  5. Js数组排序函数sort()

    JS实现多维数组和对象数组排序,用的其实就是原生sort()函数,语法为:arrayObject.sort(sortby)(sortby 可选.规定排序顺序.必须是函数.) 返回值为对数组的引用:请注 ...

  6. PHP数组排序函数array_multisort()函数详解

    这个函数因为用到了,并且在网上找了半天终于找到了一个写的通俗易懂的文章,在这里分享给大家. 原文链接:http://blog.163.com/lgh_2002/blog/static/44017526 ...

  7. PHP数组排序函数array_multisort()函数详解(二)

    array_multisort()这个函数可以对多个PHP数组进行排序,排序结果是所有的数组都按第一个数组的顺序进行排列 例如array_multisort($a,$b),$a,$b是两个数组,如果排 ...

  8. PHP的一个牛逼的数组排序函数array_multisort

    函数详情,具体可参考 官方手册 array_multisort 实际问题是这样的,有这么一组数据: $arr_times = array( array('2018-04-12 04:25:00', 3 ...

  9. JS中的数组排序函数sort()

    JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序. sort() 方法用于对数组的元素进行排序.语法如下: arrayObject.sort ...

随机推荐

  1. Stanford CS231n实践笔记(课时22卷积神经网络工程实践技巧与注意点 cnn in practise 上)

    本课主要2个实践内容: 1.keras中数据集丰富,从数据集中提取更多特征(Data augmentation) 2.迁移学习(Tranform learning) 代码:https://github ...

  2. Codeforces 835F Roads in the Kingdom - 动态规划

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一颗基环树,要求删去其中一条边,使得剩下的图形是一棵树,并且最长路的长度最短,求最长路的最短长度. 路径可以分为两部分:跨过环 和 在树内 ...

  3. 解决c1xx fatal error C1083 Cannot open source file

    在项目开发过程中,遇到一个问题,一个工程B导入另外一个工程A的生产代码,出现这个错误,最后查阅资料发现是文件路径太深,导致文件路径字符超过了217字符. 写了一个测试Demo来验证: 一.新建Win3 ...

  4. python --- 25 模块和包

    一.模块 1.导入方式 自己创建的模块名称 切不可和 内置模块的一样 ①  import  模块 ②  import 模块 as  名      设置在此空间的名称 ③  from 模块 import ...

  5. topcoder srm 320 div1

    problem1 link 两个数字后面都有阶乘符号,可以抵消. import java.util.*; import java.math.*; import static java.lang.Mat ...

  6. 【做题】CF177G2. Fibonacci Strings——思维+数列

    题意:定义斐波那契字符串为: $f_1 = $ "a" \(f_2 =\) "b" \(f_n = f_{n-1} + f_{n-2}, \, n > 2 ...

  7. html 之 img hspace 和 vspace 属性

    案例<img src="w3school.gif" hspace="30" vspace="30" /> 描述 通常图形浏览器不 ...

  8. Visual Question Answering with Memory-Augmented Networks

    Visual Question Answering with Memory-Augmented Networks 2018-05-15 20:15:03 Motivation: 虽然 VQA 已经取得 ...

  9. 数据结构和算法with Python

    http://www.math.pku.edu.cn/teachers/qiuzy/ds_python/courseware/index.htm

  10. HDU 4303 Hourai Jeweled(树形DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4303 题意:给出一棵树,树上的每一个节点都有一个权值,每条边有一个颜色,如果一条路径上相邻边的颜色都是不同的,那 ...