我想要下面的代码,它还解决了数学字符串表达式(/
,+
,-
和*
)。
array_sum(array_column(array_intersect_key($lines, array_flip($keys)), 2));
就像现在一样,上面的代码忽略了数学问题,而是坚持总和。举个例子:
expenses|test-1|628 expenses|test-2|2348/2 expenses|test-3|379
使用上面的数组代码,总和将为3355
。正确的金额为2181
。
要完全了解当前的代码行,请参阅我上一期提问的this answer。
答案 0 :(得分:0)
这应该适合你:
只需将此功能添加到您的代码中:
function calculateBasicMath($expression) {
$expression = preg_replace("/[^0-9\+\-\*\/\.\,]/", "", $expression);
while(preg_match("/(\d+)([\*\/])(\d+)/", $expression, $hM) || preg_match("/(\d+)([\+\-])(\d+)/", $expression, $lM)) {
if(!empty($hM)) {
switch($hM[2]){
case "*":
$expression = str_replace("$hM[1]$hM[2]$hM[3]", $hM[1] * $hM[3], $expression);
break;
case "/":
$expression = str_replace("$hM[1]$hM[2]$hM[3]", $hM[1] / $hM[3], $expression);
break;
}
} elseif(!empty($lM)) {
switch($lM[2]){
case "+":
$expression = str_replace("$lM[1]$lM[2]$lM[3]", $lM[1] + $lM[3], $expression);
break;
case "-":
$expression = str_replace("$lM[1]$lM[2]$lM[3]", $lM[1] - $lM[3], $expression);
break;
}
} else {
break;
}
}
return $expression;
}
然后改变你的行:
array_sum(array_column(array_intersect_key($lines, array_flip($keys)), 2));
为:
array_sum(array_map("calculateBasicMath", array_column(array_intersect_key($lines, array_flip($keys)), 2)));
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ See here
因此它基本上为每个值调用此函数。
函数本身首先替换所有期望:[0-9]+-/*.,
和preg_replace()
。然后它只是搜索基本数学,例如X[+-*/]X
。但/
和*
的优先级高于+
和-
。只要它找到这样的数学表达式,它就会计算出来并替换它们。