【问题标题】:Logical Operators expression to a PHP array逻辑运算符表达式到 PHP 数组
【发布时间】:2018-04-24 07:10:06
【问题描述】:

我有这样的表达 => ({2606} OR {2549} OR {2543} OR ({2605} AND {2562})) AND ({2387} OR {2383} OR {1990} OR {2412} OR {2411} OR {2409} OR ( {2408} 和 {2593}))

我想要这样的数组输出。

[

"AND" => [ 

     "OR" => [ 2606, 2549, 2543, "AND" => [ 2605, 2562 ] ],
     "OR" => [ 2387, 2383, 1990, 2412, 2411, 2409, "AND" => [ 2408, 2593 ] ]
 ]

]

为此需要一个 php 脚本。

【问题讨论】:

  • 这是什么 ({2606} OR {2549} OR {2543} OR ({2605} AND {2562})) AND ({2387} OR {2383} OR {1990} OR {2412} OR {2411} OR {2409} OR ({2408} AND {2593})) 数组?细绳?还有什么??
  • 如果你想要一个脚本,你为什么不写呢?
  • @SiderTopalov 这将是一个字符串。
  • @Dominique 我被困在某个地方,需要指导。你可以口头告诉我所以我可以从这个开始。这是一种嵌套的逻辑操作。我自己做不到的事情。不过仍在尝试。
  • 这是一个非常糟糕的结构,你需要的是这个['groupOp' => 'AND', 'items' =>[ [ 'field' => 'someField', 'op' => 'in', 'data' => [1,2,3,4]], 'group' => [...]],其中group 是它的递归副本,op 可以是从nn(非空)到@ 987654326@(开头)等

标签: php logical-operators


【解决方案1】:

$rule = "({2606} OR {2549} OR {2543} OR ({2605} AND {2562})) AND ({2387} OR {2383} OR {1990} OR {2412} OR {2411} OR {2409} OR ({2408} AND {2593}))";
$previous_rule = '';

// Clean Curly Braces and Trim is there's a space.
$rule = trim( str_replace( array( "{", "}" ) , "", $rule ) );

echo "INPUT: " . $rule . "<br><br>";

foreach( range('a', 'z') as $letter ){

    $substituted_part = "(". substitution( $rule ) . ")";

    $$letter = $substituted_part;

    $rule = str_replace( $substituted_part, $letter, $rule );

    if( $previous_rule != $rule )
        $previous_rule = $rule;
    else
        break;

}

echo "<PRE>";
print_r( replaceOriginal($rule) );

function replaceOriginal( $rule ){

    if( preg_match("/[a-z]/i", $rule) ){

        if( strpos( $rule, "AND" ) !== false )
            $processed_rule = array( "AND" => explode(" AND ", $rule ) );

        else if( strpos( $rule, "OR" ) !== false )
            $processed_rule = array( "OR" => explode(" OR ", $rule ) );

        foreach( $processed_rule as $operator => $values ){

            $processed_rule[$operator] = process( $values );
        }

        return $processed_rule;

    }

}

function process( $values ){

    foreach( $values as $key => $value ){

        if( !empty( $GLOBALS[$value] ) ){

            $substituted_value = str_replace( array( "(", ")" ) , "", $GLOBALS[$value] );

            $values[$key] = replaceOriginal( $substituted_value );;

        }

    }

    return $values;
}

function substitution( $rule ){

    // Get anything thats wrapped in parentheses.
    if( preg_match_all('#\((([^()]+|(?R))*)\)#', $rule, $matches) ){

        foreach( $matches[1] as $value ){
            return substitution( $value );
        }

    }else{

        return $rule;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2021-02-25
    • 2015-03-25
    相关资源
    最近更新 更多