php 自定义公式怎么设计

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《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);
}

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

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年前

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