You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过usort实现按黑名单存在性+字母序排序PHP数组?

问题解决:用usort实现指定规则的排序

可以通过usort自定义回调函数实现需求,先看原代码的问题:

  1. 用define('check', $check)定义数组常量后,直接用check[$a]访问是错误的,PHP中数组常量需要通过constant('check')获取,或者直接使用原变量$check更简便。
  2. 原回调函数只判断了$a是否在黑名单,未处理$b的状态,导致排序逻辑不完整,无法得到预期结果。

修正后的代码

$check = ['person a','person c'];
$data = ['person c','person a','person d','person e'];

print '<pre>';print_r($data);print '</pre>';

usort($data, function($a, $b) use ($check) {
    $aInBlacklist = in_array($a, $check);
    $bInBlacklist = in_array($b, $check);
    
    // 都不在黑名单,按字母序排序
    if (!$aInBlacklist && !$bInBlacklist) {
        return $a <=> $b;
    }
    // 都在黑名单,按字母序排序
    if ($aInBlacklist && $bInBlacklist) {
        return $a <=> $b;
    }
    // a不在,b在:a排前面
    if (!$aInBlacklist && $bInBlacklist) {
        return -1;
    }
    // a在,b不在:a排后面
    return 1;
});

print '<pre>';print_r($data);print '</pre>';
exit;

代码说明

  • 使用use ($check)将外部变量传入匿名函数,避免使用常量带来的问题。
  • 先判断两个元素的黑名单状态,分四种情况处理:
    • 同状态下按字母序比较(<=>是PHP7+的太空船运算符,直接返回比较结果)
    • 不同状态时,不在黑名单的元素直接排在前面。

运行后会得到预期结果:

person d
person e
person a
person c

内容的提问来源于stack exchange,提问作者Antony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:20:53