PHP array_multisort() 函数详解:多维数组排序的 N 种姿势
- 2026年7月3日
- 146 次
PHP 开发中经常遇到多维数组排序的需求,比如按用户注册时间排序、按商品价格排序等。array_multisort() 是 PHP 内置的多维数组排序函数,可以同时对多个数组进行排序,也可以对多维数组的多个字段进行排序。
array_multisort() 基本语法
array_multisort(array1, sorting_order, sorting_type, array2, ...): int
函数接受多个数组作为参数,第一个数组是排序基准,后面的数组按第一个数组的排序规则排序。返回成功排序的数组个数。
一维数组排序基础
<?php
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
// 升序排序
array_multisort($numbers);
print_r($numbers); // [1, 1, 2, 3, 4, 5, 6, 9]
// 降序排序
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
array_multisort($numbers, SORT_DESC);
print_r($numbers); // [9, 6, 5, 4, 3, 2, 1, 1]
?>
二维数组按指定字段排序
实际开发中最常见的需求:对二维数组按某个字段排序。比如用户列表按注册时间排序:
<?php
$users = [
['name' => '张三', 'age' => 25, 'score' => 88],
['name' => '李四', 'age' => 30, 'score' => 92],
['name' => '王五', 'age' => 20, 'score' => 75],
['name' => '赵六', 'age' => 25, 'score' => 95],
];
// 按年龄升序排序
$ages = array_column($users, 'age');
array_multisort($ages, SORT_ASC, $users);
print_r($users);
?>
运行结果:
Array
(
[0] => Array ( [name] => 王五 [age] => 20 [score] => 75 )
[1] => Array ( [name] => 张三 [age] => 25 [score] => 88 )
[2] => Array ( [name] => 赵六 [age] => 25 [score] => 95 )
[3] => Array ( [name] => 李四 [age] => 30 [score] => 92 )
)
array_multisort() vs usort() 对比
特性array_multisort()usort()/usort()
性能对多个数组批量排序快,单数组排序稍慢
排序稳定性稳定排序稳定排序
使用复杂度简单,一行搞定需要写比较函数
多字段排序支持一行搞定需要手动比较多个字段
多字段排序实战
<?php
$products = [
['name' => '手机', 'price' => 3999, 'stock' => 100],
['name' => '电脑', 'price' => 5999, 'stock' => 50],
['name' => '平板', 'price' => 2999, 'stock' => 200],
['name' => '耳机', 'price' => 3999, 'stock' => 500],
['name' => '键盘', 'price' => 2999, 'stock' => 150],
];
// 先按价格升序,同价格按库存升序
$prices = array_column($products, 'price');
$stocks = array_column($products, 'stock');
array_multisort($prices, SORT_ASC, $stocks, SORT_ASC, $products);
foreach ($products as $p) {
echo "{$p['name']} - ¥{$p['price']} - 库存{$p['stock']}\n";
}
?>
输出:
平板 - ¥2999 - 库存200
键盘 - ¥2999 - 库存150
手机 - ¥3999 - 库存100
耳机 - ¥3999 - 库存500
电脑 - ¥5999 - 库存50
排序类型和排序规则
排序规则排序规则说明
SORT_ASC升序默认,从小到大
SORT_DESC降序从大到小
SORT_REGULAR正常比较默认,按类型比较
SORT_NUMERIC数字比较按数值比较
SORT_STRING字符串比较按字符串比较
SORT_NATURAL自然排序文件名排序
实战场景
场景1:商品按价格排序
<?php
// 电商网站:按价格升序显示商品
function sortProductsByPrice($products, $direction = 'asc') {
$prices = array_column($products, 'price');
$sort_type = $direction === 'desc' ? SORT_DESC : SORT_ASC;
array_multisort($prices, $sort_type, $products);
return $products;
}
?>
场景2:用户按注册时间排序
<?php
// 用户管理后台:按注册时间降序显示新用户
function sortUsersByDate($users) {
$dates = array_column($users, 'created_at');
array_multisort($dates, SORT_DESC, $users);
return $users;
}
?>
场景3:混合排序(数字+字符串)
<?php
// 文件名排序,数字部分按数值比较
$files = ['file10.txt', 'file2.txt', 'file1.txt'];
// 自然排序
array_multisort($files, SORT_NATURAL);
print_r($files); // ['file1.txt', 'file2.txt', 'file10.txt']
?>
注意事项
<?php
// 电商网站:按价格升序显示商品
function sortProductsByPrice($products, $direction = 'asc') {
$prices = array_column($products, 'price');
$sort_type = $direction === 'desc' ? SORT_DESC : SORT_ASC;
array_multisort($prices, $sort_type, $products);
return $products;
}
?>
<?php
// 用户管理后台:按注册时间降序显示新用户
function sortUsersByDate($users) {
$dates = array_column($users, 'created_at');
array_multisort($dates, SORT_DESC, $users);
return $users;
}
?>
场景3:混合排序(数字+字符串)
<?php
// 文件名排序,数字部分按数值比较
$files = ['file10.txt', 'file2.txt', 'file1.txt'];
// 自然排序
array_multisort($files, SORT_NATURAL);
print_r($files); // ['file1.txt', 'file2.txt', 'file10.txt']
?>
注意事项
<?php
// 文件名排序,数字部分按数值比较
$files = ['file10.txt', 'file2.txt', 'file1.txt'];
// 自然排序
array_multisort($files, SORT_NATURAL);
print_r($files); // ['file1.txt', 'file2.txt', 'file10.txt']
?>
array_multisort() 看似简单,但有几个容易踩的坑:
- 排序会修改原数组,如果需要保留原数据,先拷贝一份
- array_column() 提取排序键时,键名必须存在于每个子数组中
- 多字段排序时,参数的顺序决定了优先级:第一个参数优先级最高
- 如果排序数组长度不一致,短的数组会用 null 补齐,可能导致意外结果
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- 上一篇: PHP 数组查找函数 in_array()、array_search()、array_keys() 实战对比
- 下一篇: hermes接入agnes-ai API实现免费文本生成、文生图、图生图、图生视频
- PHP日期函数mktime()如何使用 PHP时间函数mktime()实例代码 2022-10-15
- Typora收费标准 Typora收费版与Typora试用版有啥区别 2022-10-01
- PHP四种定义字符串的方法 PHP定义字符串4种方法有哪些? 2022-06-06
- 宝塔面板网站502 Bad Gateway报错的N种原因和解决方法 2026-07-02
- PHP如何实现图像剪裁合并?PHP实现图像剪裁合并的实例代码 2022-11-24
- PHP数组如何修改、新增、删除操作 2022-10-22
