PHP 递归计算

twtyypeuxk 2012-07-25 10:59:50
如果用递归计算出产品的价格呢?

表 pub_pp_bom_wl结构为:
bom InvCode sh sl jldw check_bom
3090106101112 1020209013112 0.0030000 0.7860000000 米 0
3090106101112 1020209011112 0.0030000 0.2795000000 米 0
3090106101112 30505075004 0.0030000 0.0628360000 个 1
3090106101112 10601006005 0.0030000 1.0000000000 张 0
3090106101112 10601005104 0.0030000 1.5000000000 米 0
3090106101112 10601004104 0.0030000 2.0000000000 个 0
3090106101112 10602002053 0.0030000 1.0000000000 个 0

如果check_bom为1 说明还有下一级,用InvCode字段的值去查bom字段就可以得到下一级的列表。
但我写了好像不能算出价格来,请大家帮我看看那里写错了,谢谢!


function mydg($bom){
global $db;
global $total;
$sql = "SELECT *,InvCode as yclwlbm, InvCode as wlbm FROM `pub_pp_bom_wl` where `bom` ='".$bom."' and `lock` = '0'";
$_list = $db->getAll($sql); //得到材料清单
foreach($_list as $inx=>$_rs){
if(intval($_rs['check_bom']) > 0){
$total += = mydg($_rs['InvCode']);
}else{
$sql = "SELECT unit_price FROM `public_co_material_price` where wlbm = '".$_rs['InvCode']."'";
$unit_price = $db->getOne($sql); //得到单价
if($unit_price==".0000000000") $unit_price = 0;
$total += ($_rs['sl'] * $unit_price) + (($unit_price * $_rs['sh'])*$_rs['sl']);
}
}
return $total;
}

...全文
185 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
twtyypeuxk 2012-07-27
  • 打赏
  • 举报
回复
and `lock` = '0 ' ";
lock 这个字段的的意思是是否被锁定,0为不被锁,也就是可用的意思。
twtyypeuxk 2012-07-27
  • 打赏
  • 举报
回复
$db-> getOne($sql); 就是得到一条记录某个字段的值。
 function getOne($sql, $limited = false)
{
if ($limited == true)
{
$sql = trim($sql . ' LIMIT 1');
}

$res = $this->query($sql);
if ($res !== false)
{
$row = mysql_fetch_row($res);

if ($row !== false)
{
return $row[0];
}
else
{
return '';
}
}
else
{
return false;
}
}
twtyypeuxk 2012-07-26
  • 打赏
  • 举报
回复
有啊,不过我写多了一个等号
$total += = mydg($_rs[ 'InvCode ']);
应该是
$total += mydg($_rs[ 'InvCode ']);
happypiggy2010 2012-07-26
  • 打赏
  • 举报
回复
好像lz没有用到递归。

if(intval($_rs[ 'check_bom ']) > 0)
{
//调用本函数+返回值
}
franzhong 2012-07-26
  • 打赏
  • 举报
回复
and `lock` = '0 ' ";
没有lock段
twtyypeuxk 2012-07-26
  • 打赏
  • 举报
回复
结构与代码不符?怎么说呢?请指教。
xuzuning 2012-07-26
  • 打赏
  • 举报
回复
你给出的数据结构与你的代码不符,所以只能假定你的程序中获取数据的代码是正确的

在此前提下,你的计算结果应该是翻番的
global $total; //这是全局变量
$total += ($_rs[ 'sl '] * $unit_price) + (($unit_price * $_rs[ 'sh '])*$_rs[ 'sl ']); //这已经是对全局变量赋值了
return $total;
$total += mydg($_rs[ 'InvCode ']); //这里就相当于 $total+$total 了

katelyn 2012-07-26
  • 打赏
  • 举报
回复
$db-> getOne($sql);
不知道getOne是什么函数,把代码都贴出来看看。
蹲坑看月亮 2012-07-26
  • 打赏
  • 举报
回复
你那个思路是正确的,你在琢磨下代码~~
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

21,889

社区成员

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

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