
本文介绍如何在 php 中根据字符串中是否包含指定关键词(如 "toner"、"drum kit"、"original")对多维数组进行自定义优先级排序,实现关键词匹配驱动的稳定分组排序。
本文介绍如何在 php 中根据字符串中是否包含指定关键词(如 "toner"、"drum kit"、"original")对多维数组进行自定义优先级排序,实现关键词匹配驱动的稳定分组排序。
在实际开发中,常需突破默认的字母序或数值序,按业务语义对数据进行分层排序——例如将含 “Toner” 的商品置顶,其次为 “Drum Kit”,最后是 “Original”。这种基于子串匹配的加权排序无法通过 sort() 或 usort() 的简单回调完成,需结合关键词映射、模糊匹配与三元比较运算符()实现。
核心思路是:为每个关键词预设优先级(数字越小,优先级越高),遍历每条记录的 articleName,查找首个匹配的关键词,并赋予对应权重;若均不匹配,可统一设为最高序号(如 PHP_INT_MAX)以确保排在末尾。
以下是完整、健壮且可复用的实现方案:
<?php
// 定义关键词优先级映射(注意:顺序无关,键值决定优先级)
$sortOrders = [
'Toner' => 0, // 最高优先级
'Drum Kit' => 1,
'Original' => 2 // 最低优先级(在本例中)
];
// 示例数据(来自原始问题)
$products = [
['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($products, function ($a, $b) use ($sortOrders) {
$priorityA = PHP_INT_MAX; // 默认最低优先级
$priorityB = PHP_INT_MAX;
// 查找 $a 的最高匹配优先级(首次命中即用,保证稳定性)
foreach ($sortOrders as $keyword => $priority) {
if (stripos($a['articleName'], $keyword) !== false) {
$priorityA = $priority;
break; // 采用首个匹配项,避免“Original”误匹配“Toner”中的“or”
}
}
// 同理处理 $b
foreach ($sortOrders as $keyword => $priority) {
if (stripos($b['articleName'], $keyword) !== false) {
$priorityB = $priority;
break;
}
}
return $priorityA <=> $priorityB;
});
// 输出结果(已按 Toner → Drum Kit → Original 分组排列)
print_r($products);✅ 关键说明与最佳实践:
- 使用 stripos() 而非 strpos() 实现大小写不敏感匹配,更符合实际搜索场景;
- break 确保每个元素仅匹配第一个满足条件的关键词,避免因子串重叠(如 "Original" 包含 "or",而 "Toner" 也含 "or")导致误判;
- 默认赋值 PHP_INT_MAX 可确保未匹配项自动沉底,增强鲁棒性;
- 该方案支持任意数量关键词扩展,只需更新 $sortOrders 数组即可;
- 若需同优先级内保持原始顺序(稳定排序),usort() 在 PHP 8.0+ 默认稳定;旧版本建议改用 uasort() 配合键索引辅助字段。
最终输出严格遵循预期:所有含 "Toner" 的条目排最前(无论大小写),其次 "Drum Kit",最后 "Original",且同组内保持原有相对顺序。

















