数组排序,在实际开发中会经常遇到,有时候还会根据数组中的某一个字段进行排序,到底如何实现呢?
这里总结了几种方式(默认都是以降序排序):
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 2
2、二维数组排序
第一种: 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