php中按字符串长度排序应使用usort()或uasort()配合自定义比较函数,用strlen()或mb_strlen()计算长度并返回差值;注意键名重置、非字符串值处理、多维数组字段安全访问及性能优化。

PHP 中用 usort() 按字符串长度排序
直接用 sort() 或 asort() 只能按字典序或值大小排,没法按长度。必须用自定义比较函数——usort() 是最常用也最稳妥的选择。
注意:它会重置数组键名(变成 0,1,2…),如果需要保留原键,改用 uasort()。
- 比较函数里用
strlen($a)和strlen($b)算长度,返回负数、0 或正数 - 升序排(短→长)就写
return strlen($a) - strlen($b); - 降序排(长→短)就反过来:
return strlen($b) - strlen($a); - 如果数组里混有非字符串值(如
null、数字),strlen()会静默转成字符串再算,可能出人意料——比如strlen(123)是 3,strlen(null)是 0
$arr = ['hi', 'hello', 'a', 'world'];
usort($arr, function($a, $b) {
return strlen($a) - strlen($b);
});
// 结果:['a', 'hi', 'hello', 'world'](注意键已重置)
多维数组里按某个字段的字符串长度排序
比如 $users 是用户数组,每个元素是 ['name' => 'Alice', 'bio' => '...'],你想按 bio 字段长度排——这时候不能直接传 strlen,得在回调里先取字段。
- 务必检查字段是否存在,否则
$item['bio']可能触发 notice - 推荐用空合并操作符:
$a['bio'] ?? '',避免未定义索引报错 - 如果字段值可能是
null或数组,strlen()仍会强制转字符串,建议加类型判断(比如用is_string()过滤)
$users = [
['name' => 'A', 'bio' => 'Hi'],
['name' => 'B', 'bio' => null],
['name' => 'C', 'bio' => 'I love coding']
];
uasort($users, function($a, $b) {
$lenA = strlen($a['bio'] ?? '');
$lenB = strlen($b['bio'] ?? '');
return $lenA - $lenB;
});
性能敏感场景下避免重复计算长度
如果数组很大(几千项以上),每次比较都调用 strlen() 两次,其实做了大量重复工作。可以预先把长度缓存出来,再排序。
- 用
array_map()提前生成[原值, 长度]的新数组 - 再用
usort()排这个带长度的数组,比较时直接取缓存值 - 最后用
array_column()提取原值——三步比反复调strlen()更快 - 不过对几百项以内的数组,这点优化几乎感知不到,别过早优化
注意 mbstring 扩展对中文等多字节字符的影响
如果你的字符串含中文、emoji 或其他 UTF-8 多字节字符,strlen() 返回的是字节数,不是字符数。比如 strlen('你好') 是 6(UTF-8 下每个汉字 3 字节),但你实际想按“2 个字符”排。
- 此时必须用
mb_strlen($str, 'UTF-8')替代strlen() - 确保 PHP 已启用
mbstring扩展,否则会报Call to undefined function mb_strlen() - 没开扩展又必须处理中文?只能退化为字节长度,或自己写简易 UTF-8 字符计数逻辑(不推荐,边界情况太多)
真正容易被忽略的点是:同一个项目里,一部分代码用 strlen(),另一部分用 mb_strlen(),结果排序逻辑不一致——尤其是当数据来源混合英文和中文时,长度语义就乱了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











