<?php
namespace app\common\util;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
/**
* 表达式操作类
*/
class Salary
{
/**
* 计算
* @param string $expression
* @return array
*/
public function evaluate(string $expression)
{
$language = new ExpressionLanguage();
try {
$result = $language->evaluate($expression);
return ['code' => 0, 'msg' => '计算成功','data'=>$result];
} catch (\Exception $exception) {
return ['code' => 999, 'msg' => '公式格式不正确,请检查'];
}
}
/**
* @return void
*/
public function compile(): void
{
$language = new ExpressionLanguage();
var_dump($language->compile('1 + 2')); // displ
}
/**
* @param $value
* @param $num
* @return array
*/
function checkSalaryItem($value, $num): array
{
$bj_num = substr_count($value, '#');
if ($bj_num % 2 == 0) {
if ($bj_num == 0 && $num > 0) {
return \app\facade\Salary::evaluate($value);
}
if (!str_contains($value, '#')) {
return \app\facade\Salary::evaluate($value);
}
$var = $this->getBetweenAB($value);
$res2 = (new SalaryItemModel)->detail(['variable' => $var]);
if (!$res2) {
return ['code' => 999, 'msg' => '公式错误,变量' . $var . '未找到'];
}
$value = str_replace('#' . $var . '#', $res2->value, $value);
$num += 1;
return $this->checkSalaryItem($value, $num);
} else {
return ['code' => 999, 'msg' => '公式错误,请检查变量#符号数量是否准确'];
}
}
/**
* @param $str
* @param string $begin
* @param string $end
* @return string
*/
private function getBetweenAB($str, string $begin = "#", string $end = "#"): string
{
if ($begin == '') return '';
$beginPos = mb_strpos($str, $begin);
if ($beginPos === false) return ''; // 起始字符不存在,直接返回空。合理
$start = $beginPos + mb_strlen($begin); // 1.1、开始截取下标
if ($end == '') $endPos = mb_strlen($str);// 结束字符不存在,默认截取到字符串末尾。合理
else $endPos = mb_strpos($str, $end, $start); // 1.2、从开始下标之后查找
if ($endPos === false) $endPos = mb_strlen($str);
$length = $endPos - $start; // 2、截取字符的长度
return mb_substr($str, $start, $length);
}
}