数组排序,在实际开发中会经常遇到,有时候还会根据数组中的某一个字段进行排序,到底如何实现呢?
这里总结了几种方式(默认都是以降序排序):
1、先来看下一维数组的排序方式:
这里先了解一下php函数:usort — 使用用户自定义的比较函数对数组中的值进行排序
//一维数组排序 降序
function my_sort($a,$b){
if ($a > $b){
return -1;
}
if ($a < $b){
return 1;
}
return 0;
}
$a=array(4,2,8,6);
usort($a, "my_sort");
var_dump($a);
输出结果:
D:\wamp64\www\test.php:32:array (size=4)
0 => int 8
1 => int 6
2 => int 4
3 => int 22、二维数组排序
第一种: usort 函数,使用用户自定义的比较函数对数组进行排序,重写key;
uasort函数,使用用户自定义的比较函数对数组按键值进行排序,并保持索引关联(不为元素分配新的键)
uasort($ary, array($this,"compareByMargin"))
######usort##############################################
//先定义一个二维数组
$infoAry = array(
array('id'=> 1, 'name' => '张三', 'age' => 25, 'tm'=> '123'),
array('id'=> 2, 'name' => '李四', 'age' => 23, 'tm'=> '111'),
array('id'=> 3, 'name' => '王五', 'age' => 40, 'tm'=> '231'),
array('id'=> 4, 'name' => '赵六', 'age' => 31, 'tm'=> '101'),
array('id'=> 5, 'name' => '黄七', 'age' => 20, 'tm'=> '241'),
);
usort($infoAry, "liveTm");
var_dump($infoAry);
function liveTm($data1,$data2)
{
if($date1['tm'] > $date2['tm'])
{
return -1;
}
return 1;
}
// function liveTm($data1,$data2) //按一个字段排序,相等时再按另一个字段排序(价值相同,先到先得)
// {
// if ($data1['tm'] < $data2['tm'])
// {
// return -1;
// }
// elseif ($data1['tm'] == $data2['tm'])
// {
// if ($data1['age'] < $data2['age'])
// {
// return -1;
// }
// else
// {
// return 1;
// }
// }
// else
// {
// return 1;
// }
// }
输出结果:
array(5) {
[0]=>
array(4) {
["id"]=>
int(5)
["name"]=>
string(6) "黄七"
["age"]=>
int(20)
["tm"]=>
string(3) "241"
}
[1]=>
array(4) {
["id"]=>
int(3)
["name"]=>
string(6) "王五"
["age"]=>
int(40)
["tm"]=>
string(3) "231"
}
[2]=>
array(4) {
["id"]=>
int(1)
["name"]=>
string(6) "张三"
["age"]=>
int(25)
["tm"]=>
string(3) "123"
}
[3]=>
array(4) {
["id"]=>
int(2)
["name"]=>
string(6) "李四"
["age"]=>
int(23)
["tm"]=>
string(3) "111"
}
[4]=>
array(4) {
["id"]=>
int(4)
["name"]=>
string(6) "赵六"
["age"]=>
int(31)
["tm"]=>
string(3) "101"
}
}
#### usort 类里面使用:################################
class test
{
public function init()
{
$postUserInfo = array(
array('uid'=>1111, 'cvalue'=>1111, 'tm'=>1111),
array('uid'=>2222, 'cvalue'=>1111, 'tm'=>2222),
array('uid'=>3333, 'cvalue'=>3333, 'tm'=>3333),
array('uid'=>4444, 'cvalue'=>4444, 'tm'=>4444),
);
usort($postUserInfo, array("test", "sortValue"));
var_dump($postUserInfo);
}
public function sortValue($data1, $data2)
{
if ($data1['cvalue'] > $data2['cvalue'])
{
return -1;
}
elseif ($data1['cvalue'] == $data2['cvalue'])
{
if ($data1['tm'] < $data2['tm'])
{
return -1;
}
else
{
return 1;
}
}
else
{
return 1;
}
}
}
$Obj = new test();
$Obj->init();第二种:使用 arsort 、asort 函数,保持原key
$arrUsers = array(
array('id'=> 1, 'name' => '张三', 'age' => 25, 'tm'=> '123'),
array('id'=> 2, 'name' => '李四', 'age' => 23, 'tm'=> '111'),
array('id'=> 3, 'name' => '王五', 'age' => 40, 'tm'=> '231'),
array('id'=> 4, 'name' => '赵六', 'age' => 31, 'tm'=> '101'),
array('id'=> 5, 'name' => '黄七', 'age' => 20, 'tm'=> '241'),
);
mySort($arrUsers, 'tm');
var_dump($arrUsers);
function mySort(&$ary, $compareField, $seq='DESC', $sortFlag=SORT_NUMERIC)
{
$sortData = array();
foreach($ary as $key => $value) {
$sortData[$key] = $value[$compareField];
}
($seq == 'DESC') ? arsort($sortData, $sortFlag) : asort($sortData, $sortFlag);
$ret = array();
foreach($sortData as $key => $value)
{
$ret[$key] = $ary[$key];
}
$ary = $ret;
return $ary;
}第三种:使用 array_multisort 函数,key重做
$arrUsers = array(
array('id'=> 1, 'name' => '张三', 'age' => 25, 'tm'=> '123'),
array('id'=> 2, 'name' => '李四', 'age' => 23, 'tm'=> '111'),
array('id'=> 3, 'name' => '王五', 'age' => 40, 'tm'=> '231'),
array('id'=> 4, 'name' => '赵六', 'age' => 31, 'tm'=> '101'),
array('id'=> 5, 'name' => '黄七', 'age' => 20, 'tm'=> '241'),
);
//$arrUsers 待排序参数,`age` 二维数组字段
//根据年龄排序 ,如果要降序排序,则第二个参数改为`SORT_DESC` | SORT_ASC
//亦可根据字符串排序,只需在`SORT_ASC`后添加参数 `SORT_STRING`
array_multisort(array_column($arrUsers, 'tm'),SORT_DESC,$arrUsers);
var_dump($arrUsers); 输出结果如图:

## array_multisort 二维数组排序
$arrUsers = array(
array('id'=> 2, 'name' => '李四', 'age' => 23, 'tm'=> '123'),
array('id'=> 1, 'name' => '张三', 'age' => 25, 'tm'=> '123'),
array('id'=> 3, 'name' => '王五', 'age' => 40, 'tm'=> '231'),
array('id'=> 4, 'name' => '赵六', 'age' => 31, 'tm'=> '101'),
array('id'=> 5, 'name' => '黄七', 'age' => 20, 'tm'=> '241'),
);
array_multisort(array_column($arrUsers, 'tm'),SORT_ASC,array_column($arrUsers, 'age'),SORT_ASC,$arrUsers);
var_dump($arrUsers);本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn