php
主页 > 网络编程 > php >

PHP二维数组按某字段排序怎么写

2026-08-31 | 佚名 | 点击:

用 usort() 配合匿名函数是最直接的写法

PHP 没有内置的「按字段名排序二维数组」函数,usort() 是最常用也最可控的方式。它允许你自定义比较逻辑,适配任意字段(包括嵌套、空值、类型混合等场景)。

关键点在于:比较函数必须返回整数(负数/0/正数),不能只写 $a['age'] 这种布尔表达式——那会强制转成 0 或 1,导致排序错乱。

1

2

3

4

5

6

7

8

9

$data = [

    ['name' => 'Alice', 'score' => 85],

    ['name' => 'Bob',   'score' => 92],

    ['name' => 'Charlie', 'score' => 78]

];

<p>usort($data, function($a, $b) {

return $a['score'] - $b['score']; // 升序

});

// $data 现在按 score 从小到大排列

字符串字段排序别忘了用 strcmp() 或 strnatcmp()

直接用减法 - 对字符串做运算会触发隐式转换(比如 'apple' - 'banana' 变成 0 - 0),结果全是 0,数组顺序不变甚至打乱。

错误示例:return $a['name'] - $b['name']; → 全是 0,白排。

要保持键名关联关系?用 uasort() 替代 usort()

usort() 会重置数组键为数字索引(0,1,2…),如果你的二维数组是用字符串键(比如 ID 作 key)构建的,且后续还要靠原 key 查找,就必须用 uasort()。

1

2

3

4

5

$data = [

    'user_101' => ['name' => 'Tom', 'level' => 3],

    'user_205' => ['name' => 'Jane', 'level' => 1],

];

<p>uasort($data, fn($a, $b) => $b['level'] - $a['level']); // 降序,且 'user_101' 键还在

性能敏感或多次排序?考虑提前提取排序列 + array_multisort()

当数组很大(几千行以上)且需按多个字段排序(比如先按 status,再按 created_at),usort() 的每次回调都要重复取字段,有轻微开销。array_multisort() 可以一次性提取所有排序列,效率略高,写法也更声明式。

1

2

$scores = array_column($data, 'score');

array_multisort($scores, SORT_DESC, $data); // 按 score 降序重排 $data

不过日常几百条数据,usort() 更直观,没必要过早优化。

原文链接:
相关文章
最新更新