php 自定义公式怎么设计

项目跟农肥有关,大概意思是输入肥料含氮量得到对应的原料投放量。以下是数据参考
需要得到50g/L的含氮肥料,投入尿素(含氮量46%)多少,公式得出来就是50/0.46,
但是有些其他的肥料里面还是有氮,公式就会变成 (50-其他含氮量)/0.46,公式由后台用户自己设置,现在主要就是卡在公式的设计上,有没有小伙伴有好的想法呀

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

设计一个公式表,主要字段有

operator 操作符
field 字段名 
level 优先级
sort 排序

level 为运算的优先级,
sort 为运算的先后顺序

上述公式可转化为:

  1. 含氮肥料 / 投入尿素
    operator field level sort
    add 含氮肥料 1 1
    div 投入尿素 1 1
  2. (含氮肥料 - 其他含氮量) / 投入尿素
    operator field level sort
    add 含氮肥料 1 1
    sub 其他含氮量 1 1
    div 投入尿素 2 1

公式表设计好了,剩下的就是解析公式:

  • 优先级1排序1的操作符一定为add,代表 运算起始点
  • 不同优先级内排序1的操作符代表 不同优先级之间的运算连接符

伪代码大概为:

查出公式集合,根据level 分组且asc 排序,分组内根据 sort asc 排序

$fieldValues = ['xxx' => 'yyy'];
$result = 0;
foreach(公式组集合 as 公式组) {
    $first =  公式组->where('sort', 1)->first();
    $method = "bc{$first->operator}";
    $subResult = 0;
    foreach(公式组 as 公式) {
        $value = $fieldValues[公式->field] ?? 0;
        $operator = 公式->operator;
        if(count(公式组) > 1 && 公式->sort === 1) {
            $operator = 'add';
        }
        $subMethod = "bc{$operator}";
        $subResult = $method($subResult, $value, 3);
    }
    $result = $method($result, $subResult, 3);
}

目前短时间想到的解决方案就是这样

1年前 评论
reiz568569 (楼主) 1年前
pigzzz (作者) 1年前
讨论数量: 3

设计一个公式表,主要字段有

operator 操作符
field 字段名 
level 优先级
sort 排序

level 为运算的优先级,
sort 为运算的先后顺序

上述公式可转化为:

  1. 含氮肥料 / 投入尿素
    operator field level sort
    add 含氮肥料 1 1
    div 投入尿素 1 1
  2. (含氮肥料 - 其他含氮量) / 投入尿素
    operator field level sort
    add 含氮肥料 1 1
    sub 其他含氮量 1 1
    div 投入尿素 2 1

公式表设计好了,剩下的就是解析公式:

  • 优先级1排序1的操作符一定为add,代表 运算起始点
  • 不同优先级内排序1的操作符代表 不同优先级之间的运算连接符

伪代码大概为:

查出公式集合,根据level 分组且asc 排序,分组内根据 sort asc 排序

$fieldValues = ['xxx' => 'yyy'];
$result = 0;
foreach(公式组集合 as 公式组) {
    $first =  公式组->where('sort', 1)->first();
    $method = "bc{$first->operator}";
    $subResult = 0;
    foreach(公式组 as 公式) {
        $value = $fieldValues[公式->field] ?? 0;
        $operator = 公式->operator;
        if(count(公式组) > 1 && 公式->sort === 1) {
            $operator = 'add';
        }
        $subMethod = "bc{$operator}";
        $subResult = $method($subResult, $value, 3);
    }
    $result = $method($result, $subResult, 3);
}

目前短时间想到的解决方案就是这样

1年前 评论
reiz568569 (楼主) 1年前
pigzzz (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!