|
|
@@ -16,6 +16,22 @@ Class FeatureService
|
|
|
return $map;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 将特征翻译为数组显示
|
|
|
+ * $str : "1&2|(3&4)"
|
|
|
+ * array:[
|
|
|
+ * "strategyGroupStartSign" => false, //是否为策略组起点,这将在解析时解析为 (
|
|
|
+ "calculation" => "", //运算规则,目前仅有 &,| 翻译后填入
|
|
|
+ "type"=>"", //特征类型
|
|
|
+ "id"=>"", //特征ID
|
|
|
+ "logic"=>"", //特征逻辑
|
|
|
+ "describe"=>"", //特征信息
|
|
|
+ "strategyGroupEndSign" => false, //是否为策略组终点,这将在解析时解析为 )
|
|
|
+ * ]
|
|
|
+ *
|
|
|
+ * @param string $str
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
public function translationFeature($str)
|
|
|
{
|
|
|
if (!$str)return null;
|
|
|
@@ -24,14 +40,14 @@ Class FeatureService
|
|
|
$sign = 0; //为第二次切割做起点标记
|
|
|
$model = [];//第二次切割数组
|
|
|
$ids = [];//记录出现的特征ID,统一查询
|
|
|
- foreach ($result[0] as $index => &$str){
|
|
|
- if (is_numeric($str)){
|
|
|
+ foreach ($result[0] as $index => &$item){
|
|
|
+ if (is_numeric($item)){
|
|
|
$model[] = array_slice($result[0],$sign,($index-$sign)+1);
|
|
|
$sign = $index+1;
|
|
|
- $ids[] = $str;
|
|
|
+ $ids[] = $item;
|
|
|
continue;
|
|
|
}
|
|
|
- if ($index == count($result[0])-1 && $str == ')'){
|
|
|
+ if ($index == count($result[0])-1 && $item == ')'){
|
|
|
$model[] = [")"];
|
|
|
}
|
|
|
}//以数字为标准切割策略组
|
|
|
@@ -50,17 +66,17 @@ Class FeatureService
|
|
|
"describe"=>"", //特征信息
|
|
|
"strategyGroupEndSign" => false,//是否为策略组终点,这将在解析时解析为 )
|
|
|
];//最终对象组模型,策略组将几组特征组合引用
|
|
|
- foreach ($m as $str){
|
|
|
- if (is_numeric($str)){//填入特征信息
|
|
|
- if (isset($featureMap[$str])){
|
|
|
- $arr["type"] = $features[$featureMap[$str]]->type;
|
|
|
- $arr["id"] = $features[$featureMap[$str]]->id;
|
|
|
- $arr["logic"] = $features[$featureMap[$str]]->logic;
|
|
|
- $arr["describe"] = $features[$featureMap[$str]]->describe;
|
|
|
+ foreach ($m as $string){
|
|
|
+ if (is_numeric($string)){//填入特征信息
|
|
|
+ if (isset($featureMap[$string])){
|
|
|
+ $arr["type"] = $features[$featureMap[$string]]->type;
|
|
|
+ $arr["id"] = $features[$featureMap[$string]]->id;
|
|
|
+ $arr["logic"] = $features[$featureMap[$string]]->logic;
|
|
|
+ $arr["describe"] = $features[$featureMap[$string]]->describe;
|
|
|
}
|
|
|
continue;
|
|
|
}
|
|
|
- switch ($str){//特殊字符的翻译
|
|
|
+ switch ($string){//特殊字符的翻译
|
|
|
case "(":
|
|
|
$arr["strategyGroupStartSign"] = true;
|
|
|
break;
|
|
|
@@ -84,6 +100,24 @@ Class FeatureService
|
|
|
return $model;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 与translationFeature相反,将一组与translationFeature参数解析为简述
|
|
|
+ * $features:[
|
|
|
+ * "strategyGroupStartSign" => false, //是否为策略组起点,这将在解析时解析为 (
|
|
|
+ "calculation" => "", //运算规则,目前仅有 &,| 翻译后填入
|
|
|
+ "type"=>"", //特征类型
|
|
|
+ "id"=>"", //特征ID
|
|
|
+ "logic"=>"", //特征逻辑
|
|
|
+ "describe"=>"", //特征信息
|
|
|
+ "strategyGroupEndSign" => false, //是否为策略组终点,这将在解析时解析为 )
|
|
|
+ * ]
|
|
|
+ * array:[
|
|
|
+ * "feature" //简述结果
|
|
|
+ * "map" //简述中出现的Map特征对象重组为key-val数组
|
|
|
+ * ]
|
|
|
+ * @param array $features
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
public function analysisFeature($features)
|
|
|
{
|
|
|
$str = "";
|
|
|
@@ -98,7 +132,7 @@ Class FeatureService
|
|
|
$feature["id"] = $f->id;
|
|
|
$map[$feature["id"]] = $f;
|
|
|
if ($feature["calculation"] == '并且')$str .= '&';
|
|
|
- else $str .= '|';
|
|
|
+ if ($feature["calculation"] == '或') $str .= '|';
|
|
|
if ($feature["strategyGroupStartSign"])$str .= "(";
|
|
|
$str .= $feature["id"];
|
|
|
if ($feature["strategyGroupEndSign"])$str .= ")";
|
|
|
@@ -106,6 +140,18 @@ Class FeatureService
|
|
|
return ['feature'=>$str,"map"=>$map];
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 格式化简述特征为可阅读显示
|
|
|
+ * $features : 特征对象集 重组为key-val数组数据,key为ID
|
|
|
+ * $value : 简述特征 例: "1&2|(3&4)"
|
|
|
+ * $columnMapping : 特征type属性字段映射 例:["商品名称"=>"commodity_name"],指定该参数会使特征格式化为SQL段
|
|
|
+ * string : 例:"商品名称 包含 衣服 并且(订单类型 等于 创建订单 或者 承运商 不包含 顺丰)"
|
|
|
+ *
|
|
|
+ * @param array $features
|
|
|
+ * @param string $value
|
|
|
+ * @param array $columnMapping
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
public function formatFeature(array $features, $value, $columnMapping = null)
|
|
|
{
|
|
|
if (!$features)return $value;
|
|
|
@@ -145,6 +191,18 @@ Class FeatureService
|
|
|
return implode("",$result[0]);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 匹配特征
|
|
|
+ * $vale : 特征简述 例: "1&2|(3|4)"
|
|
|
+ * $columnMapping : 列映射 例:["商品名称"=>"commodity_name"]
|
|
|
+ * $matchObject : 被匹配对象,必须存在列映射所指定字段 例:["commodity_name"=>"衣服"]
|
|
|
+ * bool true匹配成功 false匹配失败
|
|
|
+ *
|
|
|
+ * @param string $value
|
|
|
+ * @param array $columnMapping
|
|
|
+ * @param array $matchObject
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
public function matchFeature($value, $columnMapping, $matchObject) :bool
|
|
|
{
|
|
|
preg_match_all('/\d+/',$value,$ids);
|