PHP-求一个高效的算法,大家各抒己见

发布于 2017-01-21 13:57:46 字数 547 浏览 1396 评论 6

项目里的分类设计:
12230000,一共八位,每两位表示一个分类层级。
例如:
12000000表示“家装建材”
12230000表示“家装建材”->“瓷砖地板”
12230100表示“家装建材”->“瓷砖地板”->“防水地板”
设计的优点:
对于获取某个分类(瓷砖地板)下面的子分类直接:select * from table where id > 12230000 and id <= 12239900,然后从这个结果里面踢掉最后两位非0的记录。

这样设计随即的麻烦来了,我们怎么求出:12239900?对于计算一个二级分类下的子类这个最大值是12239900,但对于计算一级分类下的子类这个最大值就变成:12990000,同样计算三级分类子类这个最大值为:12239999。

怎么可以很优雅地计算这个最大值?现在的做法很笨:字符串截取,连接然后再str_pad。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

虐人心 2017-08-06 07:32:01

 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
*/

这样子够优雅了吗?

甜柠檬 2017-07-17 03:58:51

给你写了一个简单的方法,不用截字符串

function getMax($start){
$decimal = rtrim($start, 0);
$remainder = $start/$decimal;
$cop = ($remainder * 99)/100;
return $start + $cop;
}

$start =122300000000;
echo getMax($start);

清晨说ぺ晚安 2017-06-03 03:13:41

你这样设计有个问题,那就是三级分类下的物品不能超过99个,我估计挡不住吧?
如果非要这样,分析如下:
对于计算一级分类下的子类这个最大值小于12000000+1000000;
对于计算二级分类下的子类这个最大值小于12230000+10000;
对于计算三级分类下的子类这个最大值小于12239900+100。
所以有这么个逻辑关系:
一级分类下的+1000000
二级分类下的+10000
三级分类下的+100

清晨说ぺ晚安 2017-05-08 10:02:03

每个层级的位数可以确定那么 可以这样设计:
增加pid字段, 每条记录的 的 pid 为 上级的pid

增加level字段,为当前分类等级
举例:
id       name     pid level
12     家装建材     0 1
13     瓷砖地板     12 2
14     防水地板     13 3

如果查找 id为 13 下边的之类,pid=13 level=3

清晨说ぺ晚安 2017-04-14 06:44:15

 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');

虐人心 2017-04-01 02:56:48
$num = 12011000;    
$level = 0;
while(($num % 100) === 0) {
    $level++;
    $num /= 100;
}
echo $level;
//an=a1+(n-1)*d
//a1 = 2;
//a2 = 2 + (2-1)*2 = 4;
//a3 = 2 + (3-2)*2 = 6;
//max = num + pow(10, an)
//$sql = select * from table where id > num and id < max
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文