一个数组按另一个数组的顺序排序
PHP中的数组排序
在处理数组数据时候,有时候会给数组排序,常用的排序函数下面这些
函数 | 描述 |
---|---|
arsort() | 对关联数组按照键值进行降序排序。 |
asort() | 对关联数组按照键值进行升序排序。 |
krsort() | 对数组按照键名逆向排序。 |
ksort() | 对数组按照键名排序。 |
natcasesort() | 用“自然排序”算法对数组进行不区分大小写字母的排序。 |
natsort() | 用“自然排序”算法对数组排序。 |
sort() | 对数组排序。 |
uasort() | 使用用户自定义的比较函数对数组中的键值进行排序。 |
uksort() | 使用用户自定义的比较函数对数组中的键名进行排序。 |
usort() | 使用用户自定义的比较函数对数组进行排序。 |
array_multisort() | 对多个数组或多维数组进行排序。 |
这些常用数组排序都是单个数组排序,即使array_multisort()可以对多个或多维数组排序,但是想根据一个数组对另一个数组进行排序就比较麻烦了。
实例分析
顺序约束数据(20条):
$sort = array(20) {
[0] => int(30702)
[1] => int(30373)
[2] => int(32110)
[3] => int(32207)
[4] => int(31923)
[5] => int(1497)
[6] => int(32003)
[7] => int(30397)
[8] => int(32086)
[9] => int(31920)
[10] => int(30795)
[11] => int(31928)
[12] => int(32071)
[13] => int(32456)
[14] => int(31224)
[15] => int(32219)
[16] => int(32726)
[17] => int(31508)
[18] => int(32381)
[19] => int(41212)
}
待排序数据(5条):
$data = array(5) {
[1497] => array(3) {
["houseid"] => int(1497)
["price"] => int(25000)
["area"] => array(2) {
["min"] => int(81)
["max"] => int(193)
}
}
[30373] => array(3) {
["houseid"] => int(30373)
["price"] => int(18000)
["area"] => array(2) {
["min"] => int(109)
["max"] => int(189)
}
}
[30397] => array(3) {
["houseid"] => int(30397)
["price"] => int(12000)
["area"] => array(2) {
["min"] => int(90)
["max"] => int(132)
}
}
[30702] => array(3) {
["houseid"] => int(30702)
["price"] => int(19188)
["area"] => array(2) {
["min"] => int(0)
["max"] => int(188)
}
}
[31224] => array(3) {
["houseid"] => int(31224)
["price"] => int(15149)
["area"] => array(2) {
["min"] => int(64)
["max"] => int(178)
}
}
}
封装的方法
/**
* 用一个数组的顺序排序另一个数组
*
* @param $data 被排序数组
* @param $column 被排序数组字段 ,默认用 $data 数组key作为被排序的 字段
* @param $sort 排序数组
* @return array $data 中存在 sort对应值的 数据
*/
function arrayByArraySort($data,$sort,$column=null){
$temp = [];
if (!is_null($column)){
foreach ($data as $item){
$temp[$item[$column]][] = $item;
}
}else{
foreach ($data as $key => $item){
$temp[$key] = [$item];
}
}
$ret = [];
foreach ($sort as $sortum){
if (isset($temp[$sortum])){
$ret = array_merge($ret,$temp[$sortum]);
}
}
$ret = array_values($ret);
return $ret;
}
方法调用
$newList = arrayByArraySort($data,$sort);
var_dump($new_list);
输出结果
array(5) {
[30702] => array(3) {
["houseid"] => int(30702)
["price"] => int(19188)
["area"] => array(2) {
["min"] => int(0)
["max"] => int(188)
}
}
[30373] => array(3) {
["houseid"] => int(30373)
["price"] => int(18000)
["area"] => array(2) {
["min"] => int(109)
["max"] => int(189)
}
}
[1497] => array(3) {
["houseid"] => int(1497)
["price"] => int(25000)
["area"] => array(2) {
["min"] => int(81)
["max"] => int(193)
}
}
[30397] => array(3) {
["houseid"] => int(30397)
["price"] => int(12000)
["area"] => array(2) {
["min"] => int(90)
["max"] => int(132)
}
}
[31224] => array(3) {
["houseid"] => int(31224)
["price"] => int(15149)
["area"] => array(2) {
["min"] => int(64)
["max"] => int(178)
}
}
}
方法说明
- 上面实例中$data是没有有key值,那么就可以这样使用
$newList = arrayByArraySort($data,$sort,"houseid");
var_dump($new_list);
- 此方法还支持需要排序的字段有重复值时,也可以实现例如下面这样的数据
$data = array(5) {
[0] => array(3) {
["houseid"] => int(1497)
["price"] => int(25000)
["area"] => array(2) {
["min"] => int(81)
["max"] => int(193)
}
}
[1] => array(3) {
["houseid"] => int(1497)
["price"] => int(18000)
["area"] => array(2) {
["min"] => int(109)
["max"] => int(189)
}
}
[2] => array(3) {
["houseid"] => int(30397)
["price"] => int(12000)
["area"] => array(2) {
["min"] => int(90)
["max"] => int(132)
}
}
[3] => array(3) {
["houseid"] => int(1497)
["price"] => int(19188)
["area"] => array(2) {
["min"] => int(0)
["max"] => int(188)
}
}
[4] => array(3) {
["houseid"] => int(31224)
["price"] => int(15149)
["area"] => array(2) {
["min"] => int(64)
["max"] => int(178)
}
}
}
扩展
- 我在网上还搜索到一种方法,但是感觉效率并不高,不过可能代码量少一些,PHP一个数组按另一个数组顺序排序.
- 还有一个简单方法,不过有些局限性,大家可以参考 根据一个数组对另外一个数组进行排序问题
var_dump(array_flip($sort), $data);