我有一个需求,需要允许我的终端用户输入类似于电子表格的公式。我有一个像这样的数组:
$table = array(
1=>array(
"id"=>1,
"Name"=>"Regulating",
"Quantity"=>"[2]Quantity+[3]Value",
"Value"=>"[2]Cost"
),
...)
第一层数组键总是与该数组中的id键具有相同的值。
下面是一个表格示例:
id Name Quantity Value
1 Regulating [2]Quantity+[3]Value [2]Cost
2 Kerbs 3 6
3 Bricks 9 7
4 Sausages [3]Cost 3
5 Bamboo [4]Quantity [7]Cost
6 Clams [4]Quantity NULL
7 Hardcore [3]Quantity*0.5 12
8 Beetles [6]Quantity*[4]Value [2]Value
数量和价值键代表引用[id]和数量、价值或成本的公式。
成本是通过将价值和数量相乘得出的。
我正在使用:
preg_match_all("/\[(.*?)\]([A-Z]*[a-z]*)/", $string, $matches, PREG_SET_ORDER);
对于[1][Quantity]
,它将输出以下类似数组:
Array
(
[0] => Array
(
[0] => [2]Quantity
[1] => 2
[2] => Quantity
)
[1] => Array
(
[0] => [3]Value
[1] => 3
[2] => Value
)
)
使用类似以下代码来遍历表格: $calcString = $table[1]['Quantity'];
foreach ($matches as $match) {
$calcString = str_replace($match[0], $table[$match[1]][$match[2]], $calcString);
}
我可以获取需要计算的字符串,并使用matheval类来进行求和。
例如:
[1]Quantity = [2]Quantity + [3]Value
[2]Quantity = 3
[3]Value = 7 // [1]Quantity = 3 + 7 = 10
[1]Value = [2]Cost
[2]Cost = [2]Quantity * [2]Value // 3 * 6 = 18
基本上,表格中的变量是指同一表格中的其他[id]key
。
但这里有我的问题
我需要解决对表格其他部分(可能是公式,也可能不是)的引用,以填补空白。这超出了我的舒适区,我会感激任何提供启示的建议(或甚至更好的功能性代码),告诉我如何能够实现这一点。
谢谢