二维数组根据键进行值排序
先来看一个网上比较常见的二维数组根据键进行值排序的方法。
定义一个二维数组:
$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()两个函数,才明白是什么原理。
原来这是通过自定义排序+二进制排序方法实现的对二维数组根据键进行值排序,而文档中则直接有上诉例子,这个排序应该是比较快且省资源和内存的,毕竟是内置的函数加方法。