很烧脑的php级差计算,一般人连看都看不懂,别说正确计算了,真正的php高手请进来帮下忙,十分感谢!

pxkwd 2016-09-10 11:30:40

数据库:
CREATE TABLE IF NOT EXISTS `member` (
`shpeng` int(12) DEFAULT NULL COMMENT '接点',
`quyu` int(1) DEFAULT '0' COMMENT '第几市场,=1为第一市场,=2为第二市场,=3为第三市场',
`yzzhichu` int(12) DEFAULT NULL COMMENT '个人业绩',
`urlyz` int(1) DEFAULT '0' COMMENT '级别,分三级,=1,=2,=3',
`id` int(12) NOT NULL AUTO_INCREMENT COMMENT 'ID号',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1032 ;

INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (0, 0, 5000, 3, 1001);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1001, 1, 3000, 0, 1002);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1001, 2, 1000, 0, 1003);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1001, 3, 5000, 3, 1004);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1002, 1, 2000, 2, 1005);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1002, 2, 3000, 1, 1006);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1002, 3, 1000, 0, 1007);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1003, 1, 5000, 1, 1008);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1004, 1, 2000, 1, 1009);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1005, 1, 1000, 1, 1010);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1005, 2, 2000, 0, 1011);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1006, 1, 4000, 2, 1012);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1006, 2, 3000, 0, 1013);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1009, 1, 2000, 0, 1014);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1009, 2, 1000, 0, 1015);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1009, 3, 2000, 0, 1016);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1010, 1, 2000, 0, 1017);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1010, 2, 1000, 0, 1018);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1012, 1, 5000, 0, 1019);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1012, 2, 1000, 0, 1020);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1012, 3, 1000, 3, 1021);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1016, 1, 2000, 0, 1022);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1016, 2, 1000, 0, 1023);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1016, 3, 2000, 2, 1024);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1018, 1, 1000, 1, 1025);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1018, 2, 2000, 0, 1026);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1021, 1, 1000, 0, 1027);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1021, 2, 5000, 1, 1028);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1021, 3, 1000, 1, 1029);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1024, 1, 2000, 0, 1030);
INSERT INTO `member` (`shpeng`, `quyu`, `yzzhichu`, `urlyz`, `id`) VALUES (1024, 2, 4000, 3, 1031);


图片上黑色数字是接点人的ID,蓝色数字是金额,红色数字是级别

级别(urlyz)分三个等级,一级会员拿整个市场下业绩的1%,二级会员整个市场下业绩的2%,三级会员拿整个市场下业绩的3%,为

0时为没有级别。

每个会员下面最多只有三个部门(市场),第一市场quyu=1,第二市场quyu=2,第三市场quyu=3

现在要计算某个会员应得的市场业绩收入,先拿右侧最下面的1018举例(1025和1026下面还没有接点人,当然这两个帐号是没有业

绩收入的):

1018这个帐号下面有1025和1026,但由于1018本身没有级别(urlyz=0),所以虽然他下面有两个接点帐号了,但仍没有业绩收入。



再往上看1010,1010自身级别是一级会员(urlyz=1),那么可以拿到下面市场整体业绩的1%:

他的第一市场1017有2000元业绩

第二市场1018有1000元业绩,1018下面第一市场1025虽然有1000元业绩,但1018也已是一级会员,所以1010拿不到1018及1018下面

市场的业绩。1018下面第二市场1026有2000业绩。

因此1010的业绩收入应为:(第一市场1017的)2000元*1%+(第二市场1018、1026的)(1000元+2000元)*1%=50元



再往上看1005,1005自身级别是二级会员(urlyz=2),那么可以拿到下面市场整体业绩的2%:
他的第一市场1010已是一级会员(urlyz=1),所以他只能拿他第一市场下面的1%了,因为另外1%已被1010拿掉了,这就是级差。
他的第二市场1011没有级别,他可以拿第二市场下面的2%

因此1005的业绩收入应为:(第一市场1010下面整体业绩的1%)(1000元+2000元+1000元+1000元+2000元)*1%+(第二市场1011的

)2000元*2%=110元



再举一个1006的例子,1006自身级别是一级会员(urlyz=1),那么可以拿到下面市场整体业绩的1%:
他的第一市场1012已是二级会员,所以他拿不到1012下面的业绩了,除非他升到二级会员,可以拿1%的级差。
因此他只能拿到他的第二市场1013的1%。
因此1006的业绩收入应为:(第一市场)0元+(第二市场1013的)3000*1%+(第三市场,他还没有第三市场)0元=30元


再举一个1004的例子,1004已是自身级别是三级会员(urlyz=3),那么可以拿到下面市场整体业绩的3%:
1004只有一个第一市场1009,但1009已是一级会员(urlyz=1),因此1004只能拿1009下面整体业绩的级差2%,另外1%被1009拿掉了。
(拿1009、1014、1015、1016、1022、1023的2%)(2000元+2000元+1000元+2000元+2000元+1000元)*2%=200元
(1024已是二级会员(urlyz=2),因此只能拿1024下面1024、1030业绩的级差1%,另外2%被1024拿掉了)(2000元+2000元)*1%=40元
(1031已是三级会员(urlyz=3),同级拿不到业绩,因为1031下面的3%业绩都被1031自己拿走了。

因此1004的业绩收入应为:200元+40元=240元


以些类推,虽然言语表达起来很累赘,但明白原理用程序自动运算是很容易统计出的。如果往下有几千条数据,靠人工计算得累死。

简单点说就是统计自己下面一、二、三市场的业绩,一直往下拿,拿到和自己同级为止。如果自己是二级,下面遇到一级的就拿级差的1%,如果自己是三级,遇到一级拿级差的2%,遇到二级拿级差的1%,遇到三级就没有拿了。

请高手帮忙,万分感谢!
...全文
1724 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
pxkwd 2016-09-15
  • 打赏
  • 举报
回复
引用 30 楼 xuzuning 的回复:
既然你已经付款了,那我就发布我的代码了
感恩、感谢、感激之情言语无以表达,已站内私信联系你,请告知你的微信或QQ号,值此中秋佳节,愿以一红包略表心意、敬意!再次感谢!
xuzuning 2016-09-14
  • 打赏
  • 举报
回复
既然你已经付款了,那我就发布我的代码了
mysql_connect();
mysql_select_db('test');
$rs = mysql_query('select * from member where id=1001');
while($v = mysql_fetch_assoc($rs)) {
$res[$v['id']] = foo($v, $v['urlyz']);
}
foreach($res as $k=>$r) {
echo "$k\n";
foreach($r as $i=>$v) printf("\t%s\t%s * %.2f = %d\n", $i, join("\t", $v), ($v[0]-$v[1])/100, $v[3] * ($v[0]-$v[1])/100);
}

function foo($a, $def=-1, $last=0) {
$res = array();
extract($a);
if($def < 0) $def = $urlyz;
//查找下一级
$rs = mysql_query("select * from member where shpeng='$id'") or die(mysql_error());
while($v = mysql_fetch_assoc($rs)) {
if($def > $v['urlyz']) {
$res[$v['id']] = array($def, $last, $v['urlyz'], $v['yzzhichu']);
foreach(foo($v, $def, max($last, $v['urlyz'])) as $k=>$r) $res[$k] = $r;
}
}
return $res;
}
1001
1002 3 0 0 3000 * 0.03 = 90
1005 3 0 2 2000 * 0.03 = 60
1010 3 2 1 1000 * 0.01 = 10
1017 3 2 0 2000 * 0.01 = 20
1018 3 2 0 1000 * 0.01 = 10
1025 3 2 1 1000 * 0.01 = 10
1026 3 2 0 2000 * 0.01 = 20
1011 3 2 0 2000 * 0.01 = 20
1006 3 0 1 3000 * 0.03 = 90
1012 3 1 2 4000 * 0.02 = 80
1019 3 2 0 5000 * 0.01 = 50
1020 3 2 0 1000 * 0.01 = 10
1013 3 1 0 3000 * 0.02 = 60
1007 3 0 0 1000 * 0.03 = 30
1003 3 0 0 1000 * 0.03 = 30
1008 3 0 1 5000 * 0.03 = 150

与你 #8 提供的结果一致
共 25 行(含空行、说明、废行),合 40 元一行。你看值吗?
xuzuning 2016-09-14
  • 打赏
  • 举报
回复
他的代码在哪里? 估计是硬凑的,所以离开已有的 31 行数据就玩完了
pxkwd 2016-09-14
  • 打赏
  • 举报
回复
高手还是有的,昨天猪八戒网有人已接单解决了,但性能和效率不行,请高手中的高手再帮优化下。代码已上传,小辈可以下载下来学习学习,真金白银1000元买的单,价值1000元的源码现在免费提供给你。也请真正的高手请出手吧!
xuzuning 2016-09-14
  • 打赏
  • 举报
回复
全部的,绝无硬凑
1001
1002 3 0 0 3000 * 0.03 = 90
1005 3 0 2 2000 * 0.03 = 60
1010 3 2 1 1000 * 0.01 = 10
1017 3 2 0 2000 * 0.01 = 20
1018 3 2 0 1000 * 0.01 = 10
1025 3 2 1 1000 * 0.01 = 10
1026 3 2 0 2000 * 0.01 = 20
1011 3 2 0 2000 * 0.01 = 20
1006 3 0 1 3000 * 0.03 = 90
1012 3 1 2 4000 * 0.02 = 80
1019 3 2 0 5000 * 0.01 = 50
1020 3 2 0 1000 * 0.01 = 10
1013 3 1 0 3000 * 0.02 = 60
1007 3 0 0 1000 * 0.03 = 30
1003 3 0 0 1000 * 0.03 = 30
1008 3 0 1 5000 * 0.03 = 150
1002
1003
1004
1009 3 0 1 2000 * 0.03 = 60
1014 3 1 0 2000 * 0.02 = 40
1015 3 1 0 1000 * 0.02 = 20
1016 3 1 0 2000 * 0.02 = 40
1022 3 1 0 2000 * 0.02 = 40
1023 3 1 0 1000 * 0.02 = 20
1024 3 1 2 2000 * 0.02 = 40
1030 3 2 0 2000 * 0.01 = 20
1005
1010 2 0 1 1000 * 0.02 = 20
1017 2 1 0 2000 * 0.01 = 20
1018 2 1 0 1000 * 0.01 = 10
1025 2 1 1 1000 * 0.01 = 10
1026 2 1 0 2000 * 0.01 = 20
1011 2 0 0 2000 * 0.02 = 40
1006
1013 1 0 0 3000 * 0.01 = 30
1007
1008
1009
1014 1 0 0 2000 * 0.01 = 20
1015 1 0 0 1000 * 0.01 = 10
1016 1 0 0 2000 * 0.01 = 20
1022 1 0 0 2000 * 0.01 = 20
1023 1 0 0 1000 * 0.01 = 10
1010
1017 1 0 0 2000 * 0.01 = 20
1018 1 0 0 1000 * 0.01 = 10
1026 1 0 0 2000 * 0.01 = 20
1011
1012
1019 2 0 0 5000 * 0.02 = 100
1020 2 0 0 1000 * 0.02 = 20
1013
1014
1015
1016
1017
1018
1019
1020
1021
1027 3 0 0 1000 * 0.03 = 30
1028 3 0 1 5000 * 0.03 = 150
1029 3 0 1 1000 * 0.03 = 30
1022
1023
1024
1030 2 0 0 2000 * 0.02 = 40
1025
1026
1027
1028
1029
1030
1031



问题的关键在于理解得分的规则,当然我也是与你几轮交流后才理解的
实现时的关键在于如何传递现场,即如何体现规则

函数 function foo($a, $def=-1, $last=0) 中的 $last 是核心
而调用时 foo($v, $def, max($last, $v['urlyz'])) 是实现规则的关键
pxkwd 2016-09-13
  • 打赏
  • 举报
回复
引用 24 楼 u014461701 的回复:
你这是网站后台的检索功能还是,还是一个独立的软件,或者插件?
就是一个业绩结算功能
pxkwd 2016-09-13
  • 打赏
  • 举报
回复
引用 23 楼 okgef 的回复:
首先帖出你客户的具体意愿,不然你又手误了如何处理? 你这客户应该属于微商之类的吧……
是微商,客户的意愿就是:统计每个人下面一、二、三市场的业绩,一直往下拿,拿到和自己同级为止。如果自己是二级,下面遇到一级的就拿级差的1%,如果自己是三级,遇到一级拿级差的2%,遇到二级拿级差的1%,遇到三级就没有拿了。
  • 打赏
  • 举报
回复
你这是网站后台的检索功能还是,还是一个独立的软件,或者插件?
okgef 2016-09-13
  • 打赏
  • 举报
回复
引用 18 楼 pxkwd 的回复:
[quote=引用 17 楼 okgef 的回复:] 他这种业绩设计不是烧脑设置就是没经验没理解到客户的意愿! 这样子属于无限级,但却又很极限!
你那帮理解一下客户的意愿或者有更好的规划?洗耳恭听![/quote] 首先帖出你客户的具体意愿,不然你又手误了如何处理? 你这客户应该属于微商之类的吧……
pxkwd 2016-09-13
  • 打赏
  • 举报
回复
引用 20 楼 u013558809 的回复:
有一张表做实时记录 这样递归出来写入表应该不是很大问题把
能否给出详细可行性思路或直接给出执行代码?
pxkwd 2016-09-13
  • 打赏
  • 举报
回复
引用 19 楼 xuzuning 的回复:
猪八戒不是已经签单了么?还没弄好? 为什么 1001 只拿 1010 的 1# 而不是 2% 如果你说是因为 1005 的等级位 2 那么等级为 1 的 1010 和 等级为 0 的 1011 的区别在哪里呢? 本来,从本级应得的份额中扣除下级已得的,就是实得的份额 但你示例的计算并不是这样
是的,还没有弄好,所以能提供实质帮助的,仍会包一个红包以示感激,联系方式猪八戒上有,欢迎联系。 正如你所说,1005是2级,所以他以下的2%都被他拿走了,1001只能拿1005以下业绩的1%。 1010和1011的区别在于,1005只能拿1010的1%,而能拿1011的2%
夜雨Z1 2016-09-13
  • 打赏
  • 举报
回复
有一张表做实时记录 这样递归出来写入表应该不是很大问题把
xuzuning 2016-09-13
  • 打赏
  • 举报
回复
猪八戒不是已经签单了么?还没弄好? 为什么 1001 只拿 1010 的 1# 而不是 2% 如果你说是因为 1005 的等级位 2 那么等级为 1 的 1010 和 等级为 0 的 1011 的区别在哪里呢? 本来,从本级应得的份额中扣除下级已得的,就是实得的份额 但你示例的计算并不是这样
qq_34921650 2016-09-13
  • 打赏
  • 举报
回复
感觉这个业绩结算有点。。。必须有级差才能拿到钱,否则主要一同级就绕过没有业绩可拿,这样的设计是鼓励积极性呢,还是什么的。。。对这个设计有点纠结。不过还是说一下解决思路吧
1.数据库查询因为你这相当于无限分类,所以直接提出代码
一二三级


然后分析出级差,归类后,分析出节点,根据递归查询级差,如果有级差就提取业绩差,如果同级就跳出,遍历整个数据后,把业绩结果逐层累加,当然我也是小白,大神不要打我啊!
pxkwd 2016-09-12
  • 打赏
  • 举报
回复
引用 17 楼 okgef 的回复:
他这种业绩设计不是烧脑设置就是没经验没理解到客户的意愿! 这样子属于无限级,但却又很极限!
你那帮理解一下客户的意愿或者有更好的规划?洗耳恭听!
okgef 2016-09-12
  • 打赏
  • 举报
回复
引用 16 楼 zhi_ai_yaya 的回复:
看到这设计我就。。。2 L see 一般区域业绩,都是【自身业绩】+【下属部门业绩】两部分组合而成的,简单递归迭代就可以统计出每个大小区域的总业绩了。 就比如一个文件夹,里面只有2种类型:文件或者子文件夹。
他这种业绩设计不是烧脑设置就是没经验没理解到客户的意愿! 这样子属于无限级,但却又很极限!
pxkwd 2016-09-12
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
我们只能根据你提供的信息来设计处理程序 如果你都“手误”了,那程序该如何写?
是的是的,非常抱歉,刚又梳理了一遍,重发一下: 要求用PHP代码执行出以下结果: 图片(20160910.jpg)中黑色数字是接点人的ID,蓝色数字是金额,红色数字是级别 级别(urlyz)分三个等级,一级会员拿整个市场下业绩的1%,二级会员整个市场下业绩的2%,三级会员拿整个市场下业绩的3%,为0时为没有级别。 每个会员下面最多只有三个部门(市场),第一市场quyu=1,第二市场quyu=2,第三市场quyu=3 现在要计算某个会员应得的市场业绩收入,先拿右侧最下面的1018举例(1025和1026下面还没有接点人,当然这两个帐号是没有业绩收入的): 1018这个帐号下面有1025和1026,但由于1018本身没有级别(urlyz=0),所以虽然他下面有两个接点帐号了,但仍没有业绩收入。 再往上看1010,1010自身级别是一级会员(urlyz=1),那么可以拿到下面市场整体业绩的1%: 他的第一市场1017有2000元业绩 第二市场1018有1000元业绩,1018下面第一市场1025虽然有1000元业绩,但1025也已是一级会员,所以1010拿不到1025及1025下面市场的业绩。1018下面第二市场1026有2000业绩。 因此1010的业绩收入应为:(第一市场1017的)2000元*1%+(第二市场1018、1026的)(1000元+2000元)*1%=50元 再往上看1005,1005自身级别是二级会员(urlyz=2),那么可以拿到下面市场整体业绩的2%: 他的第一市场1010已是一级会员(urlyz=1),所以他只能拿他第一市场下面的1%了,因为另外1%已被1010拿掉了,这就是级差。 他的第二市场1011没有级别,他可以拿第二市场下面的2% 因此1005的业绩收入应为:(第一市场1010下面整体业绩的1%)(1000元+2000元+1000元+1000元+2000元)*1%+(第二市场1011的)2000元*2%=110元 再举一个1006的例子,1006自身级别是一级会员(urlyz=1),那么可以拿到下面市场整体业绩的1%: 他的第一市场1012已是二级会员,所以他拿不到1012下面的业绩了,除非他升到级会员,可以拿1%的级差。 因此他只能拿到他的第二市场1013的1%。 因此1006的业绩收入应为:(第一市场)0元+(第二市场1013的)3000*1%+(第三市场,他还没有第三市场)0元=30元 再举一个1004的例子,1004已是自身级别是三级会员(urlyz=3),那么可以拿到下面市场整体业绩的3%: 1004只有一个第一市场1009,但1009已是一级会员(urlyz=1),因此1004只能拿1009下面整体业绩的级差2%,另外1%被1009拿掉了。 (拿1009、1014、1015、1016、1022、1023的2%)(2000元+2000元+1000元+2000元+2000元+1000元)*2%=200元 (1024已是二级会员(urlyz=2),因此只能拿1024下面1024、1030业绩的级差1%,另外2%被1024拿掉了)(2000元+2000元)*1%=40元 (1031已是三级会员(urlyz=3),同级拿不到业绩,因为1031下面的3%业绩都被1031自己拿走了。 因此1004的业绩收入应为:200元+40元=240元 以些类推,虽然言语表达起来很累赘,但明白原理用程序自动运算是很容易统计出的。如果往下有几千条数据,靠人工计算得累死。 简单点说就是统计自己下面一、二、三市场的业绩,一直往下拿,拿到和自己同级为止。如果自己是二级,下面遇到一级的就拿级差的1%,如果自己是三级,遇到一级拿级差的2%,遇到二级拿级差的1%,遇到三级就没有拿了。
xuzuning 2016-09-12
  • 打赏
  • 举报
回复
我们只能根据你提供的信息来设计处理程序 如果你都“手误”了,那程序该如何写?
pxkwd 2016-09-12
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
但1018也已是一级会员 这不是你自己说的吗?怎么是我看错了?
不好意思,这是笔误: 第二市场1018有1000元业绩,1018下面第一市场1025虽然有1000元业绩,但1018也已是一级会员,所以1010拿不到1018及1018下面 应该是第二市场1018有1000元业绩,1018下面第一市场1025虽然有1000元业绩,但1025也已是一级会员,所以1010拿不到1025及1025下面的业绩
xuzuning 2016-09-12
  • 打赏
  • 举报
回复
但1018也已是一级会员 这不是你自己说的吗?怎么是我看错了?
加载更多回复(12)

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧