如何通过usort实现按黑名单存在性+字母序排序PHP数组?
问题解决:用usort实现指定规则的排序
可以通过usort自定义回调函数实现需求,先看原代码的问题:
- 用
define('check', $check)定义数组常量后,直接用check[$a]访问是错误的,PHP中数组常量需要通过constant('check')获取,或者直接使用原变量$check更简便。 - 原回调函数只判断了
$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
相关产品推荐
相关产品推荐

