先来看一个网上比较常见的二维数组根据键进行值排序的方法。

定义一个二维数组:

$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()两个函数,才明白是什么原理。

原来这是通过自定义排序+二进制排序方法实现的对二维数组根据键进行值排序,而文档中则直接有上诉例子,这个排序应该是比较快且省资源和内存的,毕竟是内置的函数加方法。