、
ID | Rule_ID | Condition_ID | Level | Operator |
------------------------------------------------------------
1 | 1 | 1 | 0 | AND |
2 | 1 | 2 | 1 | OR |
3 | 1 | 1 | 1 | OR |
4 | 1 | 2 | 0 | NULL |
だから、それが生成します:
条件1 & &を(条件2 ||条件1)||条件2
OK]をクリックして、ここで私が成功したものです:
<?php
/*(condition1) &&
(condition2) &&
(condition3
|| condition4
||
(condition6 &&
condition7)
) &&
(condition5)
id | RuleID | conditionID | level | operator
-------------------------------------------------
1 1 1 1 AND
2 1 2 1 AND
3 1 3 2 OR
4 1 4 2 OR
5 1 6 3 AND
6 1 7 3 AND
7 1 5 1 NULL
*/
$conditions = array(
array(),
array(condition=>"condition1"),
array(condition=>"condition2"),
array(condition=>"condition3"),
array(condition=>"condition4"),
array(condition=>"condition5"),
array(condition=>"condition6"),
array(condition=>"condition7")
);
$rules = array(
array(RuleID=>1,conditionID=>1,level=>1,operator=>"AND"),
array(RuleID=>1,conditionID=>2,level=>1,operator=>"AND"),
array(RuleID=>1,conditionID=>3,level=>2,operator=>"OR"),
array(RuleID=>1,conditionID=>4,level=>2,operator=>"OR"),
array(RuleID=>1,conditionID=>6,level=>3,operator=>"AND"),
array(RuleID=>1,conditionID=>7,level=>3,operator=>"AND"),
array(RuleID=>1,conditionID=>5,level=>1,operator=>null)
);
echo "<pre>";
//print_r($conditions);
//print_r($rules);
//mocking mysql ruleID filter with array_filter()
$firstrule = array_filter($rules,function($element){return ($element["RuleID"]==1);});
var_dump($firstrule);
$level = 1;
$condition_count = count($firstrule);
foreach($firstrule as $key=>$condition){
$new_level = $condition["level"];
$next_level = $firstrule[$key+1]["level"];
$prev_op = $firstrule[$key-1]["operator"];
if($new_level!=$level){
if($new_level>$level){
echo str_repeat("(",$new_level-$level);
if($condition_count > $key && $next_level < $new_level){
echo $conditions[$condition["conditionID"]]["condition"];
}else{
echo $conditions[$condition["conditionID"]]["condition"].getOperator($condition["operator"]);
}
}
else
{
if($condition_count > $key && $next_level < $new_level){
echo str_repeat(")",$level-$new_level);
echo getOperator($prev_op).$conditions[$condition["conditionID"]]["condition"] ;
}else{
echo str_repeat(")",$level-$new_level);
echo $conditions[$condition["conditionID"]]["condition"] ;
}
}
}else{
if($condition_count > $key && $next_level < $new_level){
echo $conditions[$condition["conditionID"]]["condition"];
}else{
echo $conditions[$condition["conditionID"]]["condition"].getOperator($condition["operator"]);
}
}
$level = $new_level;
}
function getOperator($op){
switch($op){
case "AND": return "&&";
case "OR" : return "||";
case null : return "";
default : return "";
}
}
?>
美しい。私はこれをかなり分析し、私はそれを愛しています。今日と明日に行って、それがどのように機能するかを報告します。ありがとう! – Swader
@Swaderこれで運がいい? – liquorvicar
まだロジックを構築していて、いくつかの新機能が追加されました。これをコンポーネントとしてデカップリングするので、他のフレームワークでも使用できます。もし私が呼吸をキャッチしたら、二日で完了し、テストしなければならない。 – Swader