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