php数组排序以及按照某个字段排序
经常,开发⼈员发现在PHP中使⽤这种数据结构对值或者数组元素进⾏排序⾮常有⽤。PHP提供了⼀些适合多种数组的排序函数,这些函数允许你在数组内部对元素进⾏排列,也允许⽤很多不同的⽅法对它们进⾏重新排序。在这篇⽂章中我们将讨论该排序中最重要的⼏个函数。
简单排序
⾸先,让我们来看看最简单的情况:将⼀个数组元素从低到⾼进⾏简单排序,这个函数既可以按数字⼤⼩排列也可以按字母顺序排列。PHP 的sort()函数实现了这个功能,如Listing A所⽰:
Listing A
<?php
 $data = array(5,8,1,7,2);
 sort($data);
 print_r($data);
 ?>
输出结果如下所⽰:
Array ([0] => 1
[1] => 2
[2] => 5
[3] => 7
[4] => 8
)
也能使⽤rsort()函数进⾏排序,它的结果与前⾯所使⽤的sort()简单排序结果相反。Rsort()函数对数组元素进⾏从⾼到低的倒排,同样可以按数字⼤⼩排列也可以按字母顺序排列。Listing B给我们展⽰了它的⼀个例⼦:
Listing B
<?php $data = array(5,8,1,7,2);rsort($data); print_r($data);
?>
它的输出结果如下:
Array ([0] => 8
[1] => 7
[2] => 5
[3] => 2
[4] => 1
)
根据关键字排序
当我们使⽤数组的时候,经常根据关键字对数组重新排序,从⾼到低。Ksort()函数就是根据关键字进⾏排序的函数,同时,它在排序的过程中会保持关键字的相关性。Listing C就是⼀个例⼦:
Listing C
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");ksort($data); print_r($data);
?>
它的输出结果如下:
Array ([DE] => Germany
[ES] => Spain
[IN] => India
[US] => United States
)
Krsort()函数是根据关键字对数组进⾏倒排,Listing D就是这样的例⼦:
Listing D
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");krsort($data); print_r($data);
?>
它的输出结果如下:
Array ([US] => United States
[IN] => India
[ES] => Spain
[DE] => Germany
)
根据值排序
如果你想使⽤值排序来取代关键字排序的话,PHP也能满⾜你的要求。你只要使⽤asort()函数来代替先前提到的ksort()函数就可以了。如Listing E所⽰:
Listing E
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");asort($data); print_r($data);
?>
下⾯就是它的输出结果。请注意这个结果与上⾯使⽤ksort()函数所得到的结果的不同——在这两种情况中,都是按字母顺序进⾏排序的,但是它们是根据数组的不同字段进⾏排序的。
同时,请注意关键字-值之间的联系会始终保持;它只是关键字-值对排序后的⼀种⽅式,排序并不会改变它们的对应关系。
Array ([DE] => Germany
[IN] => India
[ES] => Spain
[US] => United States
)
现在,你肯定能猜到这种排序也可以进⾏倒排,它使⽤arsort()函数完成这个功能。Listing F就是⼀个例⼦:
Listing F
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");arsort($data); print_r($data);
?>
下⾯是它的输出结果,根据值按字母表顺序进⾏倒排。将下⾯的结果与⽤krsort()函数进⾏倒排后⽣成的结果进⾏⽐较,就能很容易明⽩两者的不同了。
Array ([US] => United States
[ES] => Spain
[IN] => India
[DE] => Germany
)
⾃然语⾔排序
PHP有⼀个⾮常独特的排序⽅式,这种⽅式使⽤认知⽽不是使⽤计算规则。这种特性称为⾃然语⾔排序,当创建模糊逻辑应⽤软件的时候这种排序⽅式⾮常有⽤。下⾯⼤家可以来看看它的⼀个简单例⼦,如Listing G所⽰:
Listing G
<?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);
natsort($data); print_r($data);?>
它的输出结果如下:
php 数组字符串转数组Array ([0] => book-1
[1] => book-10
[2] => book-100
[3] => book-5
)
Array
(
[0] => book-1
[3] => book-5
[1] => book-10
[2] => book-100
)
它们的不同已经很清楚了:第⼆个排序结果更直观,更“⼈性化”,然⽽第⼀个则更符合算法规则,更具“计算机”特点。
⾃然语⾔能进⾏倒排吗?答案是肯定的!只要对natsort()的结果使⽤array_reverse()函数就可以了,Listing H就是⼀个简单例⼦:Listing H
<?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));
?>
下⾯是它的输出结果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根据⽤户⾃定义的规则排序
PHP也能让你定义⾃⼰的排序算法,你可以通过创建你⾃⼰的⽐较函数,并把它传递给usort()函数。如果第⼀个参数⽐第⼆个参数“⼩”的话,⽐较函数必须返回⼀个⽐0⼩的数,如果第⼀参数⽐第⼆个参数“⼤”的话,⽐较函数应该返回⼀个⽐0⼤的数。
Listing I就是这样的⼀个例⼦,在这个例⼦中根据它们的长度对数组元素进⾏排序,最短的项放在最前⾯:
Listing I
<?php $data = array("joe@host", "john.uk", "asmithsonian@us.info", "jay@zoo.tw");usort($data, 'sortByLen');
print_r($data); function sortByLen($a, $b) {
if (strlen($a) == strlen($b)) {
return 0;
} else {
return (strlen($a) > strlen($b)) ? 1 : -1;
}
}
?>
这样,就创建了我们⾃⼰的⽐较函数,这个函数使⽤strlen()函数⽐较每⼀个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下⾯是它的输出结果:
Array ([0] => jay@zoo.tw
[1] => joe@host
[2] => john.uk
[3] => asmithsonian@us.info
)
⾃然语⾔排序
PHP有⼀个⾮常独特的排序⽅式,这种⽅式使⽤认知⽽不是使⽤计算规则。这种特性称为⾃然语⾔排序,当创建模糊逻辑应⽤软件的时候这种排序⽅式⾮常有⽤。下⾯⼤家可以来看看它的⼀个简单例⼦,如Listing G所⽰:
Listing G
<?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);
natsort($data); print_r($data);?>
它的输出结果如下:
Array ([0] => book-1
[1] => book-10
[2] => book-100
[3] => book-5
)
Array
(
[0] => book-1
[3] => book-5
[1] => book-10
[2] => book-100
)
它们的不同已经很清楚了:第⼆个排序结果更直观,更“⼈性化”,然⽽第⼀个则更符合算法规则,更具“计算机”特点。
⾃然语⾔能进⾏倒排吗?答案是肯定的!只要对natsort()的结果使⽤array_reverse()函数就可以了,Listing H就是⼀个简单例⼦:
Listing H
<?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));
?>
下⾯是它的输出结果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根据⽤户⾃定义的规则排序
PHP也能让你定义⾃⼰的排序算法,你可以通过创建你⾃⼰的⽐较函数,并把它传递给usort()函数。如果第⼀个参数⽐第⼆个参数“⼩”的话,⽐较函数必须返回⼀个⽐0⼩的数,如果第⼀参数⽐第⼆个参数
“⼤”的话,⽐较函数应该返回⼀个⽐0⼤的数。
Listing I就是这样的⼀个例⼦,在这个例⼦中根据它们的长度对数组元素进⾏排序,最短的项放在最前⾯:
Listing I
<?php $data = array("joe@host", "john.uk", "asmithsonian@us.info", "jay@zoo.tw");usort($data, 'sortByLen');
print_r($data); function sortByLen($a, $b) {
if (strlen($a) == strlen($b)) {
return 0;
} else {
return (strlen($a) > strlen($b)) ? 1 : -1;
}
}
?>
这样,就创建了我们⾃⼰的⽐较函数,这个函数使⽤strlen()函数⽐较每⼀个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下⾯是它的输出结果:
Array ([0] => jay@zoo.tw
[1] => joe@host
[2] => john.uk
[3] => asmithsonian@us.info
)
多维排序
最后,PHP也允许在多维数组上执⾏⼀些⽐较复杂的排序——例如,⾸先对⼀个嵌套数组使⽤⼀个普通的关键字进⾏排序,然后再根据另⼀个关键字进⾏排序。这与使⽤SQL的ORDER BY语句对多个字段进
⾏排序⾮常相似。为了能更好的明⽩它是如何⼯作的,请仔细看Listing J 所举的例⼦:
Listing J
<?php $data = array(array("id" => 1, "name" => "Boney M", "rating" => 3),
array("id" => 2, "name" => "Take That", "rating" => 1),
array("id" => 3, "name" => "The Killers", "rating" => 4),
array("id" => 4, "name" => "Lusain", "rating" => 3),
); foreach ($data as $key => $value) {
$name[$key] = $value['name'];
$rating[$key] = $value['rating'];
}
array_multisort($rating, $name, $data); print_r($data);?>
这⾥,我们在$data数组中模拟了⼀个⾏和列数组。然后,我使⽤array_multisort()函数对数据集合进⾏重排,⾸先是根据rating进⾏排序,然后,如果rating相等的话,再根据name排序。它的输出结果如下:
Array ([0] => Array
(
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论