PHP按特定key进行多维数组排序
这个排序在网上直接搜索的结果有这样一个:
array_multisort(array_column($array,'sort'),SORT_ASC,$array);
这个是错误的。 切忌不要以讹传讹了。
分析排查
实际上array_multisort 是PHP内置的方法,官方有说明: PHP - array_multisort
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 之后。 提供的数组和之前的数组要有相同数量的元素。 换言之,排序是按字典顺序排列的。
第一个参数是需要排序的数组
array_multisort( $array );
排序默认是 升序、按常规数字方式, 如果不需要则可以省略
array_multisort( $array ); // SORT_ASC, SORT_REGULAR
array_multisort( $array, SORT_DESC, SORT_NATURAL );
最后一个参数 排序参考, 这里的 参考也就是说 排序会按照最后这个数组的key来进行排序。
array_multisort( $array, $howToSort );
array_multisort( $array, SORT_DESC, SORT_NATURAL, $howToSort );
最后来一段demo
<?php
<?php
$menu = [
[
"id"=>1,
"sort"=>100
],
[
"id"=>2,
"sort"=>50
],
[
"id"=>3,
"sort"=>60
]
];
$tmp = array_column($menu,'sort');
asort($tmp);
array_multisort($menu, $tmp );
print_r( $menu );
Array
(
[0] => Array
(
[id] => 1
[sort] => 100
)
[1] => Array
(
[id] => 2
[sort] => 50
)
[2] => Array
(
[id] => 3
[sort] => 60
)
)
可以发现,用这样的方式无法实现我们目标。 因为我们进行key排序之后,tmp数组的key 又变成了 0,1,2....n 这样也就意味着作为参考数组,失去了参考价值。
如果非要用这个 array_multisort() 就需要处理 这个参考数组。相当麻烦: 这里贴一段PHP官网网友的实现: https://www.php.net/manual/zh/function.array-multisort.php#100534
function array_orderby()
{
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
?>
The sorted array is now in the return value of the function instead of being passed by reference.
<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
// Pass the array, followed by the column names and sort flags
$sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC);
最终结果
实际上完全没必要,我们使用usort就可以轻松解决问题。
<?php
function compareBySort( array $a, array $b ): int{
return $a['sort'] <= $b['sort'] ? -1 : 1;
}
$menu = [
[
"id":1,
"sort"=>100
],
[
"id"=>2,
"sort"=>50
],
[
"id"=>3,
"sort"=>60
]
];
usort($menu, "compareBySort" );
print_r( $menu );
Array
(
[0] => Array
(
[id] => 2
[sort] => 50
)
[1] => Array
(
[id] => 3
[sort] => 60
)
[2] => Array
(
[id] => 1
[sort] => 100
)
)
大功告成!
文章地址: PHP按特定key进行多维数组排序 - Sprite keep learning
最近回复