如何在按数字区间分组的PHP数组中快速查询随机数对应的分组
实现方案
方案1:单次查询直接遍历(适合查询次数少的场景)
直接遍历区间数组,逐行判断随机数是否落在当前区间,匹配到就直接返回对应值,代码实现简单:
function getGroup($num, $list) { foreach ($list as $item) { list($start, $end) = explode('-', $item[0]); if ($num >= intval($start) && $num <= intval($end)) { return $item[1]; } } return ''; // 区间完整覆盖1-100的情况下不会走到该分支 } // 调用示例 $list = [ ['1-4','first'], ['5-7','next'], ['8-10','third group'], ['11-12','another group'], ['94-97','almost done'], ['98-100','first'] ]; $num = rand(1,100); $result = getGroup($num, $list);
方案2:预生成映射表(适合多次查询的场景)
因为区间范围固定为1-100,提前把每个数字对应的分组值存入映射数组,后续查询直接取索引即可,查询时间复杂度为O(1),性能更高:
// 预先生成映射表,只需执行一次 $groupMap = []; foreach ($list as $item) { list($start, $end) = explode('-', $item[0]); for ($i = intval($start); $i <= intval($end); $i++) { $groupMap[$i] = $item[1]; } } // 后续多次查询直接调用即可 $num = rand(1,100); $result = $groupMap[$num];
只要你的区间是连续无重叠的,两种方案都可以正常运行,可根据自己的业务查询频次选择对应的实现。
内容的提问来源于stack exchange,提问作者Jabbamonkey
相关产品推荐
相关产品推荐

