有时候我们需要根据会员的积分或者消费或者什么什么的来确定会员的等级,因为积分等级规则可能会变动,有序的数据查找可以用二分法来查找,我觉得可以这样写
原生:
<?php
/**
* 二分法查找
*
* @param int $score 积分
* @param array $filter 积分规则
*
* @return array $filter
*/
function search($score, $filter)
{
$half = floor(count($filter) / 2); // 取出中間数
// 判断积分在哪个区间
if ($score <= $filter[$half - 1]['max']) {
$filter = array_slice($filter, 0 , $half);
} else {
$filter = array_slice($filter, $half , count($filter));
}
// 继续递归直到只剩一个元素
if (count($filter) != 1) {
$filter = search($score, $filter);
}
return $filter;
}
$filter = [
['level' => 1, 'min' => 1, 'max' => 9999],
['level' => 2, 'min' => 10000, 'max' => 19999],
['level' => 3, 'min' => 20000, 'max' => 29999],
['level' => 4, 'min' => 30000, 'max' => 39999],
['level' => 5, 'min' => 40000, 'max' => 49999],
['level' => 6, 'min' => 50000, 'max' => 999999999],
];
$result = search(2400, $filter);
echo current($result)['level'];
框架中用法,以TP5.1为例:
/**
* 二分法查找
*
* @param int $score 积分
* @param array $filter 积分规则
*
* @return array $filter
*/
public function search($score, $filter)
{
$half = floor(count($filter) / 2); // 取出中間数
// 判断积分在哪个区间
if ($score <= $filter[$half - 1]['max']) {
$filter = array_slice($filter, 0 , $half);
} else {
$filter = array_slice($filter, $half , count($filter));
}
// 继续递归直到只剩一个元素
if (count($filter) != 1) {
$filter = $this->search($score, $filter);
}
return $filter;
}
public function level()
{
$filter = [
['level' => 1, 'min' => 1, 'max' => 9999],
['level' => 2, 'min' => 10000, 'max' => 19999],
['level' => 3, 'min' => 20000, 'max' => 29999],
['level' => 4, 'min' => 30000, 'max' => 39999],
['level' => 5, 'min' => 40000, 'max' => 49999],
['level' => 6, 'min' => 50000, 'max' => 999999999],
];
$result = $this->search(2400, $filter);
echo current($result)['level'];
}