FeatureService.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. continue;
  29. }
  30. if ($index == count($result[0])-1 && $str == ')'){
  31. $model[] = [")"];
  32. }
  33. }//以数字为标准切割策略组
  34. $features = Feature::query()->find($ids);//查询出现的特征
  35. $featureMap = [];
  36. foreach ($features as $index => $feature){
  37. $featureMap[$feature->id] = $index;
  38. }//为查询的特征重组为key-val形式数组留做引用
  39. foreach ($model as $index => &$m){
  40. $arr = [
  41. "strategyGroupStartSign" => false,//是否为策略组起点,这将在解析时解析为 (
  42. "calculation" => "",//运算规则,目前仅有 &,| 翻译后填入
  43. "type"=>"", //特征类型
  44. "id"=>"", //特征ID
  45. "logic"=>"", //特征逻辑
  46. "describe"=>"", //特征信息
  47. "strategyGroupEndSign" => false,//是否为策略组终点,这将在解析时解析为 )
  48. ];//最终对象组模型,策略组将几组特征组合引用
  49. foreach ($m as $str){
  50. if (is_numeric($str)){//填入特征信息
  51. if (isset($featureMap[$str])){
  52. $arr["type"] = $features[$featureMap[$str]]->type;
  53. $arr["id"] = $features[$featureMap[$str]]->id;
  54. $arr["logic"] = $features[$featureMap[$str]]->logic;
  55. $arr["describe"] = $features[$featureMap[$str]]->describe;
  56. }
  57. continue;
  58. }
  59. switch ($str){//特殊字符的翻译
  60. case "(":
  61. $arr["strategyGroupStartSign"] = true;
  62. break;
  63. case ")":
  64. $model[$index-1]["strategyGroupEndSign"] = true;
  65. break;
  66. case "&":
  67. $arr["calculation"] = "并且";
  68. break;
  69. case "|":
  70. $arr["calculation"] = "或";
  71. break;
  72. }
  73. }
  74. if (!$arr["id"]){
  75. unset($model[$index]);
  76. continue;
  77. }
  78. $m = $arr;//变更当前指针为翻译结果
  79. }
  80. return $model;
  81. }
  82. }