代码之家  ›  专栏  ›  技术社区  ›  Mark Roddy

把一根绳子分成若干部分

  •  0
  • Mark Roddy  · 技术社区  · 6 年前

    我在表格中有一个问题列表,其中一些问题只有在满足某些条件时才会显示出来。记录的标准可能简单到4002=Y,其中4002是问题编号,Y是答案。如果4002=Y,则显示问题。

    对于只有一个标准的记录,我没有问题。

    但是还有一些记录具有如下标准:

    402=Y OR 7003=Y OR 905=Y OR 7007=Y OR 7008=Y OR 7010=Y OR 7011=Y OR 7013=Y
    

    在这种情况下,我需要评估每个选项,看看是否要显示问题。

    其他问题也会有类似的字符串;一些较短,一些较长。

    如何最好地拆分字符串,以便一次评估每个部分,并且仍然能够正确比较它们?

    我可以在某种程度上重新格式化数据,但如果可能的话,我宁愿不这样做。

    这是 regex() 任务(我还不太熟悉)?我试过了 list() , split() explode() 几乎没有成功。

    任何建议都会受到赞赏。

    5 回复  |  直到 15 年前
        1
  •  3
  •   caf    15 年前

    如果您的输入字符串实际上只是一组用“或”分隔的简单条件,那么一个简单的explode()确实可以做到这一点:

    $criteria = "402=Y OR 7003=Y OR 905=Y OR 7007=Y OR 7008=Y OR 7010=Y OR 7011=Y OR 7013=Y";
    $split_criteria = explode("OR", $criteria);
    
    foreach ($split_criteria as $single)
    {
        echo trim($single) . "\n";
    }
    

    但是,如果它更复杂(如果您允许并且也允许或者说),那么您将需要一个相应更智能的解析器。

        2
  •  1
  •   deceze    15 年前
    $criteria = '402=Y OR 7003=Y OR 905=Y OR 7007=Y OR 7008=Y OR 7010=Y OR 7011=Y OR 7013=Y';
    $rules = array();
    foreach (explode(' OR ', $criteria) as $criterium) {
        $rule = explode('=', $criterium);
        $rules[$rule[0]] = ($rule[1] == 'Y');
    }
    
    var_dump($rules);
    // array() {
    //     [402]=> bool(true)
    //     [7003]=> bool(true)
    //     [905]=> bool(true)
    //     ...
    // }
    
    $isAnyRuleTrue = in_array(true, $rules);
    
        3
  •  0
  •   ghostdog74    15 年前

    你可以试试

    if (strpos($record,"OR" )!==FALSE){
        $s = explode("OR",$record);
        foreach ($s as $k){
          #do something with $k
        }
    }
    
        4
  •  0
  •   grantwparks    15 年前

    我首先对字符串运行regex,将“separator”更改为“&”——尤其是在“or”周围可能有多余的空格的情况下(在regex中更容易表达这一点,而不是尝试单独调整/修剪每个词)。然后使用 parse_str() 您有一个数组,其中每个索引都是问题编号,值是“y”或“n”。

        5
  •  0
  •   rezzif    15 年前

    这假设您指定的格式,我假设可能的值是y(是)或n(否)。

    
    $string = '402=Y OR 7003=Y OR 905=Y OR 7007=Y OR 7008=Y OR 7010=Y OR 7011=Y OR 7013=Y';
    $regex = "/\b([\d]+)=([YN])\b/";
    
    if (preg_match_all($regex, $string, $matches)) {
           print_r($matches);
    }
    
    Should give you:
    Array
    (
        [0] => Array
            (
                [0] => 402=Y
                [1] => 7003=Y
                [2] => 905=Y
                [3] => 7007=Y
                [4] => 7008=Y
                [5] => 7010=Y
                [6] => 7011=Y
                [7] => 7013=Y
            )
    
        [1] => Array
            (
                [0] => 402
                [1] => 7003
                [2] => 905
                [3] => 7007
                [4] => 7008
                [5] => 7010
                [6] => 7011
                [7] => 7013
            )
    
        [2] => Array
            (
                [0] => Y
                [1] => Y
                [2] => Y
                [3] => Y
                [4] => Y
                [5] => Y
                [6] => Y
                [7] => Y
            )
    
    )