php 自定义公式怎么设计

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

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

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

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

2年前 评论
reiz568569 (楼主) 2年前
pigzzz (作者) 2年前
讨论数量: 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);
}

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

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

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