FeatureService.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. namespace App\Services;
  3. use App\Feature;
  4. Class FeatureService
  5. {
  6. public function getMapArray()
  7. {
  8. $features = Feature::query()->get();
  9. $map = [];
  10. foreach ($features as $feature){
  11. $map[$feature->id] = ["type"=>$feature->type,"logic"=>$feature->logic,"describe"=>$feature->describe];
  12. }
  13. return $map;
  14. }
  15. public function translationFeature($str)
  16. {
  17. if (!$str)return null;
  18. $result = [];
  19. preg_match_all('/\d+|[\&\|\(\)]/',$str,$result); //初次匹配以数字&|()为分隔符生成数组
  20. $sign = 0; //为第二次切割做起点标记
  21. $model = [];//第二次切割数组
  22. $ids = [];//记录出现的特征ID,统一查询
  23. foreach ($result[0] as $index => &$str){
  24. if (is_numeric($str)){
  25. $model[] = array_slice($result[0],$sign,($index-$sign)+1);
  26. $sign = $index+1;
  27. $ids[] = $str;
  28. }
  29. }//以数字为标准切割策略组
  30. $features = Feature::query()->find($ids);//查询出现的特征
  31. $featureMap = [];
  32. foreach ($features as $index => $feature){
  33. $featureMap[$feature->id] = $index;
  34. }//为查询的特征重组为key-val形式数组留做引用
  35. foreach ($model as $index => &$m){
  36. $arr = [
  37. "strategyGroupStartSign" => false,//是否为策略组起点,这将在解析时解析为 (
  38. "calculation" => "",//运算规则,目前仅有 &,| 翻译后填入
  39. "type"=>"", //特征类型
  40. "id"=>"", //特征ID
  41. "logic"=>"", //特征逻辑
  42. "describe"=>"", //特征信息
  43. "strategyGroupEndSign" => false,//是否为策略组终点,这将在解析时解析为 )
  44. ];//最终对象组模型,策略组将几组特征组合引用
  45. foreach ($m as $str){
  46. if (is_numeric($str)){//填入特征信息
  47. if (isset($featureMap[$str])){
  48. $arr["type"] = $features[$featureMap[$str]]->type;
  49. $arr["id"] = $features[$featureMap[$str]]->id;
  50. $arr["logic"] = $features[$featureMap[$str]]->logic;
  51. $arr["describe"] = $features[$featureMap[$str]]->describe;
  52. }
  53. continue;
  54. }
  55. switch ($str){//特殊字符的翻译
  56. case "(":
  57. $arr["strategyGroupStartSign"] = true;
  58. break;
  59. case ")":
  60. $model[$index-1]["strategyGroupEndSign"] = true;
  61. break;
  62. case "&":
  63. $arr["calculation"] = "并且";
  64. break;
  65. case "|":
  66. $arr["calculation"] = "或";
  67. break;
  68. }
  69. }
  70. $m = $arr;//变更当前指针为翻译结果
  71. }
  72. return $model;
  73. }
  74. }