PHP函数由1,2,4,6,8,16,32...不重复二进倍数之和,反推具体的二倍数

79 阅读1分钟

近日有一个需求,甲方为了Mysql存储和查询方便,给出的某字段的数据是由二倍数之和组成,我们需要反查这些二倍数,再展示出来。

需求场景描述: 级别分为 (1=>'班长',2=>'排长',4=>'连长',8=>'营长',16=>'团长',32=>'师长',64=>'军长') 某场所对不同级别的组合可以开放,比如 sum值为14就是:2+4+8=14的组合。

二进倍数之和,反推求值,递归函数来了

function findCombination($number, $doubleLists){
    $max_key = max(array_keys($doubleLists));
    for($i= $number>$max_key? $max_key:$number ;
            $i>0; $i--){
        if (!isset($doubleLists[$i])) continue;
        if (isset($doubleLists[$i])){
            $chunkIdx = array_search($i, array_keys($doubleLists));
            $newList = array_chunk($doubleLists, $chunkIdx, true);
            //echo "找到:".$i."=>".$doubleLists[$i]."<br>";
            $ret = findCombination( $number-$i , $newList[0]);
            return $ret ? $ret.",".$doubleLists[$i]:$doubleLists[$i];
            break;
        }
    }
}
$arr = [1=>'班长',2=>'排长',4=>'连长',8=>'营长'16=>'团长',32=>'师长',64=>'军长'];
print_r(findCombination(14 ,$arr));

输出:排长,连长,营长

没有用二进制方式来写函数了,前提条件是输入的参数是二倍数相加。

希望对你有帮助!