Hiro技术站

插件专区新篇—-Hiro.pagenav:自渲染、自解析的分页插件 v1.8更新

PHP:数组排序函数大总结

分类:PHP 发表时间:2009年08月20日 字体大小:12号14号

上周去得到一个面试题,题目是这样的:PHP中sort()、asort()、ksort()函数之前的区别是什么,在什么情况下改用哪个函数?我当时的答案就不在这公布了,呵呵,总之不对的。

回来后一直在揪心啊,于是翻了一下书本查阅,给我知道了答案。为了记住它们,我决定来一个数组排序函数大总结。

一、一维数组

假设有一个一维数组,如下:

1
$sortArr = array("name"=>"hiro", "age"=>"23", "city"=>"Shanghai", "code"=>"200051");

print_r()输出的原始数组结果为:

1
Array ( [name] => hiro [age] => 23 [city] => Shanghai [code] => 200051 )

1.sort()函数:根据数组下标进行升序排列;
print_r()输出的数组结果为(输出时只有数组下标,而不是键名):

1
Array ( [0] => 23 [1] => 200051 [2] => Shanghai [3] => hiro )

2.rsort()函数:与sort()函数相反,根据数组下标进行降序排列;
print_r()输出的数组结果为(输出时只有数组下标,而不是键名):

1
Array ( [0] => hiro [1] => Shanghai [2] => 200051 [3] => 23 )

3.asort()函数:根据数组的键名进行升序排列;
print_r()输出的数组结果为:

1
Array ( [age] => 23 [code] => 200051 [city] => Shanghai [name] => hiro )

4.arsort()函数:与asort()函数相反,根据数组的键名进行降序排列;
print_r()输出的数组结果为:

1
Array ( [name] => hiro [city] => Shanghai [code] => 200051 [age] => 23 )

5.ksort()函数:根据数组的键值进行升序排列;
print_r()输出的数组结果为:

1
Array ( [age] => 23 [city] => Shanghai [code] => 200051 [name] => hiro )

6.krsort()函数:与ksort()函数相反,根据数组的键值进行降序排列;
print_r()输出的数组结果为:

1
Array ( [name] => hiro [city] => Shanghai [code] => 200051 [age] => 23 )

7.reverse_array()函数:反向当前的数组排列顺序;
print_r()输出的数组结果为:

1
Array ( [name] => hiro [age] => 23 [city] => Shanghai [code] => 200051 )

8.shuffle()函数:随机地排列数组顺序(每次刷新后排列的顺序都不相同);
print_r()输出的数组结果为(只是其中一种随机排列):

1
Array ( [0] => 23 [1] => 200051 [2] => Shanghai [3] => hiro )

二、二维数组

假设有一个二维数组,如下:

1
2
3
4
5
$person = array(
	array("hiro", "23", "suzhou"),
	array("yoyo", "25", "shanghai"),
	array("janstar", "28", "xinjiang")
);

print_r()输出的原始数组结果为:

1
Array ( [0] => Array ( [0] => hiro [1] => 23 [2] => suzhou ) [1] => Array ( [0] => yoyo [1] => 25 [2] => shanghai ) [2] => Array ( [0] => janstar [1] => 28 [2] => xinjiang ) )

二维数组的排序是根据每维的键名排序的,所以需要额外地编写比较函数。先举三个例子:

1.按每维的第一个元素升序排列,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function compare0($x, $y) {
	if($x[0] == $t[0]) {
		return 0;
	} elseif ($x[0] < $y[0]) {
		return -1;
	} else {
		return 1;
	}
}
 
usort($person, compare0);
echo "按第一个元素正向排序:";
print_r($person);

输出的结果如下:

1
按第一个元素正向排序:Array ( [0] => Array ( [0] => hiro [1] => 23 [2] => suzhou ) [1] => Array ( [0] => janstar [1] => 28 [2] => xinjiang ) [2] => Array ( [0] => yoyo [1] => 25 [2] => shanghai ) )

2.按每维的第三个元素升序排列,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function compare2($x, $y) {
	if($x[2] == $t[2]) {
		return 0;
	} elseif ($x[2] < $y[2]) {
		return -1;
	} else {
		return 1;
	}
}
 
usort($person, compare2);
echo "按第三个元素正向排序:";
print_r($person);

输出的结果如下:

1
按第三个元素正向排序:Array ( [0] => Array ( [0] => yoyo [1] => 25 [2] => shanghai ) [1] => Array ( [0] => hiro [1] => 23 [2] => suzhou ) [2] => Array ( [0] => janstar [1] => 28 [2] => xinjiang ) )

3.按每维的第三个元素升序排列,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function reverse_compare2($x, $y) {
	if($x[2] == $t[2]) {
		return 0;
	} elseif ($x[2] < $y[2]) {
		return 1;	//改变后即可反向
	} else {
		return -1;	//改变后即可反向
	}
}
 
usort($person, reverse_compare2);
echo "按第三个元素反向排序:";
print_r($person);

输出的结果如下:

1
按第三个元素反向排序:Array ( [0] => Array ( [0] => janstar [1] => 28 [2] => xinjiang ) [1] => Array ( [0] => hiro [1] => 23 [2] => suzhou ) [2] => Array ( [0] => yoyo [1] => 25 [2] => shanghai ) )

呵呵,是不是代码多了点,记下了以后方便查阅啊!

不错不错,已经有 个评论!
  1. 纯沙发了,不做评论。。。

  2. 我也在学PHP,还有好多不懂哦

    • 慢慢学呗!都是这么过来的,学校都没这门课的。

  3. 好多啊~

  4. ca

    先拷贝起来再说

  5. 很详细,收藏了

我要评论

* *