近日有一个需求,甲方为了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));
输出:排长,连长,营长
没有用二进制方式来写函数了,前提条件是输入的参数是二倍数相加。
希望对你有帮助!