李涛自留地
回到顶部
首页 > php学习 > PHP array_multisort() 函数详解:多维数组排序的 N 种姿势

PHP array_multisort() 函数详解:多维数组排序的 N 种姿势

文章目录

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']
?>

注意事项

array_multisort() 看似简单,但有几个容易踩的坑:

- 排序会修改原数组,如果需要保留原数据,先拷贝一份
- array_column() 提取排序键时,键名必须存在于每个子数组中
- 多字段排序时,参数的顺序决定了优先级:第一个参数优先级最高
- 如果排序数组长度不一致,短的数组会用 null 补齐,可能导致意外结果

若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。