PHP中二维数组根据某个字段排序有两种办法,一种是通过sort自己写代码,一种是直接用array_multisort排序函数。
PHP的一维数组排序函数:
实现方法: 取出要排序的值组成值数组(为一维数组),按要求对值进行排序(保持键值关系),遍历值数组,按照键对应赋值给结果数组。
function arraySort($array,$keys,$sort='asc') {
$newArr = $valArr = array();
foreach ($array as $key=>$value) {
$valArr[$key] = $value[$keys];
}
($sort == 'asc') ? asort($valArr) : arsort($valArr);
reset($valArr);
foreach($valArr as $key=>$value) {
$newArr[$key] = $array[$key];
}
return $newArr;
}
array_multisort ( array &$array1
[, mixed $array1_sort_order
= SORT_ASC [, mixed $array1_sort_flags
= SORT_REGULAR [, mixed $...
]]] ) : bool
array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
关联(string)键名保持不变,但数字键名会被重新索引。
array1
要排序的 array。
array1_sort_order
之前 array 参数要排列的顺序。 SORT_ASC
按照上升顺序排序, SORT_DESC
按照下降顺序排序。
此参数可以和 array1_sort_flags
互换,也可以完全删除,默认是 SORT_ASC
。
array1_sort_flags
为 array 参数设定选项:
排序类型标志:
SORT_REGULAR
- 将项目按照通常方法比较(不修改类型)SORT_NUMERIC
- 按照数字大小比较SORT_STRING
- 按照字符串比较SORT_LOCALE_STRING
- 根据当前的本地化设置,按照字符串比较。 它会使用 locale 信息,可以通过 setlocale() 修改此信息。SORT_NATURAL
- 以字符串的"自然排序",类似 natsort()SORT_FLAG_CASE
- 可以组合 (按位或 OR) SORT_STRING
或者 SORT_NATURAL
大小写不敏感的方式排序字符串。参数可以和 array1_sort_order
交换或者省略,默认情况下是 SORT_REGULAR
。
...
可选的选项,可提供更多数组,跟随在 sort order 和 sort flag 之后。 提供的数组和之前的数组要有相同数量的元素。 换言之,排序是按字典顺序排列的。
成功时返回 TRUE
, 或者在失败时返回 FALSE
。
例1:
$ar1 = array("10", 101, 100, 6);
$ar2 = array(1, 3, 6, 5);
array_multisort($ar1, $ar2);
print_r($ar1);
print_r($ar2);
第二个数组中的项目顺序完全和第一个数组中相应的项目顺序一致。
Array
(
[0] => 6
[1] => 10
[2] => 100
[3] => 101
)
Array
(
[0] => 5
[1] => 1
[2] => 6
[3] => 3
)
例2:
$ar = array(
array("b10", 'c11', 101, 100, "a"),
array(1, 2, "2", 9, 5)
);
array_multisort($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC);
print_r($ar);
经过排序后,第一个数组将包含 "b10", 'c11',101,100,"a"(作为字符串上升排序),第二个数组将包含 1,2,"2",9,5(作为数值下降排序)。
Array
(
[0] => Array
(
[0] => 100
[1] => 101
[2] => a
[3] => b10
[4] => c11
)
[1] => Array
(
[0] => 9
[1] => 2
[2] => 5
[3] => 1
[4] => 2
)
)
例3:(我们要的结果)
$data[] = array('customer_name' => '小李', 'money' => 12, 'distance' => 2, 'address' => '长安街C坊');
$data[] = array('customer_name' => '王晓', 'money' => 30, 'distance' => 10, 'address' => '北大街30号');
$data[] = array('customer_name' => '赵小雅', 'money' => 89, 'distance' => 6, 'address' => '解放路恒基大厦A座');
$data[] = array('customer_name' => '小月', 'money' => 150, 'distance' => 5, 'address' => '天桥十字东400米');
$data[] = array('customer_name' => '李亮亮', 'money' => 45, 'distance' => 26, 'address' => '天山西路198弄');
$data[] = array('customer_name' => '董娟', 'money' => 67, 'distance' => 17, 'address' => '新大南路2号');
// 取得列的列表
foreach ($data as $key => $row) {
$distance[$key] = $row['distance'];
$money[$key] = $row['money'];
}
array_multisort($distance, SORT_DESC, $data);
print_r($data);
$data包含有行的数组,但是 array_multisort() 需要一个包含列的数组,因此用foreach来取得列,然后排序。
所有,我们将array_multisort() 封装下:
/**
* 二维数组根据某个字段排序
* @param array $array 要排序的数组
* @param string $keys 要排序的键字段
* @param string $sort 排序类型 SORT_ASC SORT_DESC
* @return array 排序后的数组
*/
function arraySort($array, $keys, $sort = SORT_DESC) {
$keysValue = [];
foreach ($array as $k => $v) {
$keysValue[$k] = $v[$keys];
}
array_multisort($keysValue, $sort, $array);
return $array;
}
继续使用上例中的$data 数组
# 按距离降序排序
$a = arraySort($data, 'distance', SORT_DESC);
print_r($a);
# 按money升序排序
$b = arraySort($data, 'money', SORT_ASC);
print_r($b);
效果:
Array
(
[0] => Array
(
[customer_name] => 李亮亮
[money] => 45
[distance] => 26
[address] => 天山西路198弄
)
[1] => Array
(
[customer_name] => 董娟
[money] => 67
[distance] => 17
[address] => 新大南路2号
)
[2] => Array
(
[customer_name] => 王晓
[money] => 30
[distance] => 10
[address] => 北大街30号
)
[3] => Array
(
[customer_name] => 赵小雅
[money] => 89
[distance] => 6
[address] => 解放路恒基大厦A座
)
[4] => Array
(
[customer_name] => 小月
[money] => 150
[distance] => 5
[address] => 天桥十字东400米
)
[5] => Array
(
[customer_name] => 小李
[money] => 12
[distance] => 2
[address] => 长安街C坊
)
)
Array
(
[0] => Array
(
[customer_name] => 李亮亮
[money] => 45
[distance] => 26
[address] => 天山西路198弄
)
[1] => Array
(
[customer_name] => 董娟
[money] => 67
[distance] => 17
[address] => 新大南路2号
)
[2] => Array
(
[customer_name] => 王晓
[money] => 30
[distance] => 10
[address] => 北大街30号
)
[3] => Array
(
[customer_name] => 赵小雅
[money] => 89
[distance] => 6
[address] => 解放路恒基大厦A座
)
[4] => Array
(
[customer_name] => 小月
[money] => 150
[distance] => 5
[address] => 天桥十字东400米
)
[5] => Array
(
[customer_name] => 小李
[money] => 12
[distance] => 2
[address] => 长安街C坊
)
)
Array
(
[0] => Array
(
[customer_name] => 小李
[money] => 12
[distance] => 2
[address] => 长安街C坊
)
[1] => Array
(
[customer_name] => 王晓
[money] => 30
[distance] => 10
[address] => 北大街30号
)
[2] => Array
(
[customer_name] => 李亮亮
[money] => 45
[distance] => 26
[address] => 天山西路198弄
)
[3] => Array
(
[customer_name] => 董娟
[money] => 67
[distance] => 17
[address] => 新大南路2号
)
[4] => Array
(
[customer_name] => 赵小雅
[money] => 89
[distance] => 6
[address] => 解放路恒基大厦A座
)
[5] => Array
(
[customer_name] => 小月
[money] => 150
[distance] => 5
[address] => 天桥十字东400米
)
)