PHP自定义数组排序需用usort()、uasort()或array_multisort():usort()用于索引数组升序;按绝对值排序在回调中用abs();uasort()保留关联键名;多维数组按子键排序直接访问字段;array_multisort()支持多条件稳定排序。

如果您需要对 PHP 数组中的元素按值的大小进行排序,并且要求排序逻辑可自定义(例如按绝对值、字符串长度、多维字段等),则不能仅依赖内置的 sort() 或 rsort() 函数。以下是实现该目标的多种方法:
usort() 允许传入用户自定义的比较函数,PHP 会根据该函数的返回值决定元素顺序,适用于索引数组且不保留键名。该方法灵活、简洁,适合大多数单维数值或简单结构排序需求。
1、定义待排序的数组,例如 $arr = [3, 1, 4, 1, 5];
2、调用 usort(),传入数组和匿名比较函数:usort($arr, function($a, $b) { return $a $b; });
立即学习“PHP免费学习笔记(深入)”;
3、执行后 $arr 将变为 [1, 1, 3, 4, 5],完成升序排列。
当数组包含负数,而您希望忽略符号、仅依据数值大小排序时,需在比较函数中对参数取绝对值。此方式避免了先映射再排序的额外内存开销,直接在比较阶段介入。
1、定义数组,例如 $arr = [-5, 3, -1, 8];
2、调用 usort() 并在闭包中使用 abs():usort($arr, function($a, $b) { return abs($a) abs($b); });
3、执行后 $arr 变为 [-1, 3, -5, 8],即按 绝对值从小到大 排列。
若原始数组为关联数组(如 ['a' => 10, 'b' => 2, 'c' => 15]),且需按值排序但保留键与值的对应关系,则必须使用 uasort()。它与 usort() 行为一致,但不重置键名。
1、声明关联数组:$data = ['apple' => 23, 'banana' => 7, 'cherry' => 19];
2、调用 uasort() 并传入比较逻辑:uasort($data, function($v1, $v2) { return $v1 $v2; });
3、排序后 $data 的键值对顺序改变,但 'banana' => 7 仍存在且位于首位,键名未丢失。
当数组元素为关联子数组(如 [['name'=>'A','score'=>85], ['name'=>'B','score'=>92]]),需按 'score' 字段排序时,可在比较函数中提取并比较对应键的值。此方法无需预处理,直接在回调中访问深层结构。
1、定义多维数组:$students = [['name'=>'Alice','score'=>85], ['name'=>'Bob','score'=>92], ['name'=>'Charlie','score'=>78]];
2、使用 usort(),在闭包中读取 'score' 键:usort($students, function($a, $b) { return $a['score'] $b['score']; });
3、结果数组按 score 升序排列,首位元素为 ['name'=>'Charlie','score'=>78]。
当需按多个字段先后排序(例如先按 type 升序,type 相同时按 created_at 降序),array_multisort() 提供更可控的稳定性保障,且支持独立提取排序列,避免嵌套回调复杂度。
1、提取待排序字段:$types = array_column($items, 'type'); $times = array_column($items, 'created_at');
2、调用 array_multisort(),依次传入字段及排序标志:array_multisort($types, SORT_ASC, $times, SORT_DESC, $items);
3、$items 被原地重排,满足 type 升序优先、同 type 内 created_at 降序 的复合规则。
以上就是php怎么对数组循环值大小排列_php数组排序循环usort自定义比较法【技巧】的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号