使用array_multisort()可高效实现PHP数组多条件排序,通过传入多个排序键数组及对应规则(如SORT_DESC、SORT_NUMERIC),结合array_column()提取排序列,能直观地对关联数组按优先级排序,相比usort()性能更优,但需注意数据类型匹配和原始数组被修改的问题;对于复杂逻辑可用usort(),而大数据量建议在数据库层面用ORDER BY处理。

在PHP中,对数组进行多条件排序,
array_multisort()
array_multisort()
我们来看一个常见的场景:你有一个用户列表,每个用户有姓名、年龄和分数。现在,你想先按年龄降序排列,如果年龄相同,再按分数升序排列,最后如果分数也相同,就按姓名升序排列。
<?php
$users = [
['name' => 'Alice', 'age' => 30, 'score' => 85],
['name' => 'Bob', 'age' => 25, 'score' => 90],
['name' => 'Charlie', 'age' => 30, 'score' => 90],
['name' => 'David', 'age' => 25, 'score' => 85],
['name' => 'Eve', 'age' => 30, 'score' => 85],
];
// 提取用于排序的列
$ages = array_column($users, 'age');
$scores = array_column($users, 'score');
$names = array_column($users, 'name');
// 执行多条件排序
// 1. 按年龄降序 (SORT_DESC)
// 2. 按分数升序 (SORT_ASC)
// 3. 按姓名升序 (SORT_ASC)
array_multisort(
$ages, SORT_DESC, SORT_NUMERIC, // 年龄:降序,按数字排序
$scores, SORT_ASC, SORT_NUMERIC, // 分数:升序,按数字排序
$names, SORT_ASC, SORT_STRING, // 姓名:升序,按字符串排序
$users // 最后是被排序的原始数组
);
echo "<pre>";
print_r($users);
echo "</pre>";
/*
输出结果大致会是:
Array
(
[0] => Array
(
[name] => Charlie
[age] => 30
[score] => 90
)
[1] => Array
(
[name] => Alice
[age] => 30
[score] => 85
)
[2] => Array
(
[name] => Eve
[age] => 30
[score] => 85
)
[3] => Array
(
[name] => Bob
[age] => 25
[score] => 90
)
[4] => Array
(
[name] => David
[age] => 25
[score] => 85
)
)
*/
?>在这个例子中,
array_column()
$users
age
score
name
SORT_DESC
SORT_ASC
SORT_NUMERIC
SORT_STRING
array_multisort()
$users
array_multisort()
$users
立即学习“PHP免费学习笔记(深入)”;
array_multisort()
当我们面对的是一个包含多个关联数组(或者说是“行”)的数组时,
array_multisort()
最常用的方法,也是我上面示例中用到的,就是
array_column()
想象一下,你有一个产品列表,每个产品有ID、名称、价格和库存。你可能想先按库存降序排列,然后按价格升序排列。
<?php
$products = [
['id' => 101, 'name' => 'Laptop', 'price' => 1200, 'stock' => 50],
['id' => 102, 'name' => 'Mouse', 'price' => 25, 'stock' => 200],
['id' => 103, 'name' => 'Keyboard', 'price' => 75, 'stock' => 50],
['id' => 104, 'name' => 'Monitor', 'price' => 300, 'stock' => 10],
['id' => 105, 'name' => 'Webcam', 'price' => 50, 'stock' => 200],
];
// 提取库存和价格列
$stocks = array_column($products, 'stock');
$prices = array_column($products, 'price');
// 排序:先按库存降序,再按价格升序
array_multisort(
$stocks, SORT_DESC, SORT_NUMERIC, // 库存:降序,数字类型
$prices, SORT_ASC, SORT_NUMERIC, // 价格:升序,数字类型
$products // 原始数组被修改
);
echo "<pre>";
print_r($products);
echo "</pre>";
/*
输出结果:
Array
(
[0] => Array
(
[id] => 102
[name] => Mouse
[price] => 25
[stock] => 200
)
[1] => Array
(
[id] => 105
[name] => Webcam
[price] => 50
[stock] => 200
)
[2] => Array
(
[id] => 101
[name] => Laptop
[price] => 1200
[stock] => 50
)
[3] => Array
(
[id] => 103
[name] => Keyboard
[price] => 75
[stock] => 50
)
[4] => Array
(
[id] => 104
[name] => Monitor
[price] => 300
[stock] => 10
)
)
*/
?>这里需要注意的是,
array_multisort()
对于对象数组,原理是类似的。你可能需要先将对象转换为关联数组(例如通过
json_decode(json_encode($object), true)
array_map
usort()
array_multisort()
array_column()
array_multisort()
虽然
array_multisort()
ReportPlust意在打造一套精美的数据报表模板,里面高度封装日历组件、表格组件、排行榜组件、条形进度条组件、文本块组件以及ucharts的多个图表组件,用户只需要按照虚拟数据的格式,传特定数据即可方便、快捷地打造出属于自己的报表页面。该小程序主要使用了ucharts和wyb-table两插件实现的数据报表功能。 特点使用的是uni-app中最受欢迎的图表uCharts插件完成图表展示,该插件
0
数据类型和排序标志(Sort Flags)的匹配:这是我看到很多人容易犯错的地方。
array_multisort()
SORT_NUMERIC
SORT_STRING
SORT_REGULAR
SORT_STRING
SORT_NUMERIC
SORT_NUMERIC
SORT_STRING
SORT_REGULAR
$data = ["10", "2", "1"]; $arr1 = $data; $arr2 = $data; array_multisort($arr1, SORT_STRING); // "1", "10", "2" array_multisort($arr2, SORT_NUMERIC); // "1", "2", "10" // 看到区别了吗?这很重要。
array_multisort()
array_multisort()
array_multisort()
array_multisort()
array_merge([], $original_array)
clone
$originalUsers = [/* ... */];
$sortedUsers = $originalUsers; // 这是一个浅拷贝,array_multisort依然会修改$originalUsers
// 正确的做法:
// $sortedUsers = array_map(function($item){ return $item; }, $originalUsers); // 深度拷贝(如果子元素也是数组)
// 或者更简单的,在 array_multisort 的最后一个参数传入一个副本
// 假设我们只关心排序后的结果,原始数组被修改通常是预期行为
array_multisort($ages, SORT_DESC, $scores, SORT_ASC, $originalUsers);
// 此时 $originalUsers 已经被排序了性能考量(针对大数据集):对于大多数 Web 应用中的数组大小(几百到几千条记录),
array_multisort()
array_multisort()
array_column()
ORDER BY
总的来说,
array_multisort()
array_multisort()
当然,
array_multisort()
usort()
usort()
usort()
array_multisort()
array_multisort()
array_multisort()
usort()
usort()
<?php
$users = [
['name' => 'Alice', 'age' => 30, 'score' => 85],
['name' => 'Bob', 'age' => 25, 'score' => 90],
['name' => 'Charlie', 'age' => 30, 'score' => 90],
['name' => 'David', 'age' => 25, 'score' => 85],
['name' => 'Eve', 'age' => 30, 'score' => 85],
];
usort($users, function($a, $b) {
// 先按年龄降序
if ($a['age'] != $b['age']) {
return $b['age'] <=> $a['age']; // PHP 7+ 飞船操作符
}
// 年龄相同,再按分数升序
if ($a['score'] != $b['score']) {
return $a['score'] <=> $b['score'];
}
// 分数也相同,最后按姓名升序
return $a['name'] <=> $b['name'];
});
echo "<pre>";
print_r($users);
echo "</pre>";
?>数据库 ORDER BY
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
SELECT id, name, age, score FROM users ORDER BY age DESC, score ASC, name ASC;
综合来看,我个人的建议是:
array_multisort()
usort()
ORDER BY
选择哪种方法,最终还是取决于你的数据结构、数据量以及排序逻辑的复杂程度。没有银弹,只有最适合当前场景的工具。
以上就是如何在PHP中对数组进行多条件排序?array_multisort()的用法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号