先来看一个网上比较常见的二维数组根据键进行值排序的方法。
定义一个二维数组:
$item=[
[
'initial' => 'A5',
'name' => 'name2',
],
[
'initial' => 'A3',
'name' => 'name5',
],
[
'initial' => 'B8',
'name' => 'name1',
],
[
'initial' => 'B2',
'name' => 'name9',
],
[
'initial' => 'A8',
'name' => 'name4',
],
[
'initial' => 'B9',
'name' => 'name8',
],
[
'initial' => 'A6',
'name' => 'name3',
],
];
具体的实现方法
/**
* 二维数组根据键进行值排序
* @param array $array 需要排序的数组
* @param string $field 排序的键
* @param string $sort 排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
* @return mixed
*/
function arraySequence($array, $field, $sort = 'SORT_DESC')
{
$arrSort = array();
foreach ($array as $uniqid => $row) {
foreach ($row as $key => $value) {
$arrSort[$key][$uniqid] = $value;
}
}
array_multisort($arrSort[$field], constant($sort), $array);
return $array;
}
var_dump(arraySequence($item,'initial'));
这是网上比较普遍的一种方法,之前也是一直在用这种,因为实在找不到更简单的方法了。
但在前两天看一个php高级教程书籍的时候,发现了另一种更简单的方法。
/**
* 通过闭包函数和usort函数对二维数组根据键进行值排序
* $y在前为降序,$x在前为升序
* @param $key array 需要排序的数组
* @return Closure
*/
function build_sorter($key) {
return function ($x, $y) use ($key) {
return strnatcmp($y[$key], $x[$key]);
};
}
usort($item, build_sorter('initial'));
var_dump($item);
看起来很简单暴力的一直方法,但确实有效,然后就在php文档中查了一下strnatcmp()和usort()两个函数,才明白是什么原理。
原来这是通过自定义排序+二进制排序方法实现的对二维数组根据键进行值排序,而文档中则直接有上诉例子,这个排序应该是比较快且省资源和内存的,毕竟是内置的函数加方法。