usort函数通过自定义比较函数排序数组,需返回负数($a在$b前)、0(相等)或正数($a在$b后);支持数字、关联数组键、字符串(用strcmp)、多条件及空值处理,并可调用类方法或静态方法。

PHP 的 usort 函数允许你用自定义逻辑对数组进行排序,关键在于写好比较函数——它必须接收两个参数,返回负数、0 或正数来表示大小关系。
比较函数的基本结构
比较函数接收两个元素(通常叫 $a 和 $b),返回值决定排序顺序:
- 返回 负数(如 -1):表示
$a应排在$b前面(升序) - 返回 0:表示两者相等,顺序不变
- 返回 正数(如 1):表示
$a应排在$b后面(降序)
例如按数字大小升序排列:
php$arr = [3, 1, 4, 1, 5];
usort($arr, function($a, $b) {
return $a - $b; // 简洁写法,差值直接反映大小关系
});
print_r($arr); // [1, 1, 3, 4, 5]
?>
按关联数组的某个键排序
常见需求是按二维数组中某字段排序,比如按用户年龄升序:
['name' => 'Alice', 'age' => 30],
['name' => 'Bob', 'age' => 25],
['name' => 'Charlie', 'age' => 35]
];
usort($users, function($a, $b) {
return $a['age'] - $b['age']; // 升序
});
?>
若要降序,把减法反过来:$b['age'] - $a['age'],或加负号:-($a['age'] - $b['age'])。
处理字符串、多条件和空值
字符串建议用 strcmp() 避免类型隐式转换问题;多条件可用“短路”判断;空值需主动处理,否则可能出错:
['title' => 'Apple', 'score' => 9],
['title' => 'Banana', 'score' => null],
['title' => 'Cherry', 'score' => 7]
];
usort($data, function($a, $b) {
// 先按 score 降序(null 排最后)
$scoreA = $a['score'] ?? -INF;
$scoreB = $b['score'] ?? -INF;
if ($scoreA !== $scoreB) {
return $scoreB - $scoreA;
}
// score 相同时按 title 升序
return strcmp($a['title'], $b['title']);
});
?>
使用类方法或静态方法作比较函数
如果逻辑复杂,可封装到类里。注意传递方式:
- 实例方法:
[$obj, 'methodName'] - 静态方法:
[ClassName::class, 'staticMethod']或['ClassName', 'staticMethod']
例如:
class SortHelper {public static function sortByLength($a, $b) {
return strlen($a) - strlen($b);
}
}
$words = ['hi', 'hello', 'a'];
usort($words, [SortHelper::class, 'sortByLength']);
// ['a', 'hi', 'hello']
?>
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











