PHP-求一个高效的算法,大家各抒己见
项目里的分类设计:
12230000,一共八位,每两位表示一个分类层级。
例如:
12000000表示“家装建材”
12230000表示“家装建材”->“瓷砖地板”
12230100表示“家装建材”->“瓷砖地板”->“防水地板”
设计的优点:
对于获取某个分类(瓷砖地板)下面的子分类直接:select * from table where id > 12230000 and id <= 12239900,然后从这个结果里面踢掉最后两位非0的记录。
这样设计随即的麻烦来了,我们怎么求出:12239900?对于计算一个二级分类下的子类这个最大值是12239900,但对于计算一级分类下的子类这个最大值就变成:12990000,同样计算三级分类子类这个最大值为:12239999。
怎么可以很优雅地计算这个最大值?现在的做法很笨:字符串截取,连接然后再str_pad。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
function getMaxId($id){
//最大支持9位数
if($id<0 || $id>999999999) return -1;
$mod = 100;
$n=99;
if($id) while(!($n=($id%$mod))) $mod*=100;
return $id-$n + $mod*.99;
}
function getMinId($id){
//最大支持9位数
if($id<0 || $id>999999999) return -1;
$mod = 100;
$n=0;
if($id) while(!($n=($id%$mod))) $mod*=100;
return $id-$n;
}
$id = 12345678;
echo 'Min:', getMinId($id), "rn";
echo 'Max:', getMaxId($id);
/*
输出:
Min:12345600
Max:12345699
*/
这样子够优雅了吗?
给你写了一个简单的方法,不用截字符串
function getMax($start){
$decimal = rtrim($start, 0);
$remainder = $start/$decimal;
$cop = ($remainder * 99)/100;
return $start + $cop;
}
$start =122300000000;
echo getMax($start);
你这样设计有个问题,那就是三级分类下的物品不能超过99个,我估计挡不住吧?
如果非要这样,分析如下:
对于计算一级分类下的子类这个最大值小于12000000+1000000;
对于计算二级分类下的子类这个最大值小于12230000+10000;
对于计算三级分类下的子类这个最大值小于12239900+100。
所以有这么个逻辑关系:
一级分类下的+1000000
二级分类下的+10000
三级分类下的+100
每个层级的位数可以确定那么 可以这样设计:
增加pid字段, 每条记录的 的 pid 为 上级的pid
增加level字段,为当前分类等级
举例:
id name pid level
12 家装建材 0 1
13 瓷砖地板 12 2
14 防水地板 13 3
如果查找 id为 13 下边的之类,pid=13 level=3
function getMaxChild($pid){
//$pid=12206100;
$str='';
for($i=1;$i<=4;$i++){
$test=substr($pid,0,2);
$pid=substr($pid,2,strlen($pid));
if($test=="00"){
return $str.'99'.$pid;break;
}elseif($i==4){
return false;
}else{
$str.=$test;
}
}
}
echo getMaxChild('12200000');