
本文介绍如何在 PHP 中根据字符串中是否包含指定关键词(如 "Toner"、"Drum Kit"、"Original")对多维数组进行精准优先级排序,使用 usort() 配合闭包函数实现灵活、可维护的自定义排序逻辑。
本文介绍如何在 php 中根据字符串中是否包含指定关键词(如 "toner"、"drum kit"、"original")对多维数组进行精准优先级排序,使用 `usort()` 配合闭包函数实现灵活、可维护的自定义排序逻辑。
在实际开发中,常需突破默认的字母序或数值序限制,按业务语义对数据进行分层排序。例如,电商商品列表中希望“Toner”类耗材置顶,“Drum Kit”乐器次之,“Original”配件再次之——这种基于关键词匹配的优先级排序无法通过简单 sort() 或 asort() 实现,必须借助 usort() 结合自定义比较逻辑。
核心思路是:为每个关键词预设一个整数优先级(越小越靠前),遍历数组元素时,检查其 articleName 是否包含任一关键词,并据此赋予对应排序权重;若均不匹配,则统一归入最低优先级(如 PHP_INT_MAX),确保未命中项排在末尾。
以下是推荐的健壮实现方案:
<?php // 定义关键词与对应优先级(数字越小,排序越靠前)
$sortOrders = [
'Toner' => 0,
'Drum Kit' => 1,
'Original' => 2
];
// 示例数据(注意:关键词匹配不区分大小写,后续可扩展)
$data = [
['articleID' => 3166, 'articleName' => 'Drum Kit MultiPack'],
['articleID' => 2073, 'articleName' => 'Toner black TN-241BK'],
['articleID' => 3241, 'articleName' => 'Toner black TN-241BK'],
['articleID' => 3242, 'articleName' => 'Original Kit colour']
];
usort($data, function($a, $b) use ($sortOrders) {
// 初始化默认优先级:未匹配时排最后
$priorityA = PHP_INT_MAX;
$priorityB = PHP_INT_MAX;
// 检查 $a 的 articleName 是否匹配任一关键词(支持子串匹配)
foreach ($sortOrders as $keyword => $priority) {
if (stripos($a['articleName'], $keyword) !== false) {
$priorityA = $priority;
break; // 找到最高优先级匹配即停止(避免被低优先级覆盖)
}
}
// 同理检查 $b
foreach ($sortOrders as $keyword => $priority) {
if (stripos($b['articleName'], $keyword) !== false) {
$priorityB = $priority;
break;
}
}
return $priorityA $priorityB;
});
print_r($data);
✅ 关键优势说明:
- 使用 stripos() 实现不区分大小写的子串匹配(如 "toner" 或 "TONER" 均可命中 "Toner");
- break 确保首个匹配关键词生效,符合“Toner > Drum Kit > Original”的优先级链;
- 默认值 PHP_INT_MAX 保障无匹配项自动沉底,避免未定义行为;
- 通过 use ($sortOrders) 将优先级配置注入闭包,解耦逻辑与配置,便于维护和复用。
⚠️ 注意事项:
- 若关键词存在包含关系(如 "Original" 和 "Original Kit"),建议按长度从长到短排序键名,或改用正则精确匹配,防止误判;
- 大量数据下可预先为每个元素缓存匹配结果(如添加临时 sortPriority 字段),避免重复 stripos 调用;
- 生产环境建议封装为独立方法,支持传入 $field(排序字段名)和 $caseSensitive 参数,提升通用性。
该方案兼顾简洁性、可读性与扩展性,是处理关键词驱动排序任务的标准实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











