0

我在表格中有一个问题列表,其中一些问题只有在满足某些条件时才会显示。一条记录可能具有像 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()收效甚微。

任何指针将不胜感激。

4

5 回答 5

3

如果您的输入字符串真的只是一堆用“或”分隔的简单标准,那么一个简单的 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";
}

但是,如果它更复杂(例如,如果您允许 AND 以及 OR),那么您将需要一个相应更智能的解析器。

于 2009-07-27T02:48:07.950 回答
1
$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);
于 2009-07-27T03:00:26.837 回答
0

你可以试试

if (strpos($record,"OR" )!==FALSE){
    $s = explode("OR",$record);
    foreach ($s as $k){
      #do something with $k
    }
}
于 2009-07-27T02:50:09.460 回答
0

这假设您指定的格式,我假设可能的值是 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
        )

)

于 2009-07-27T03:00:34.437 回答
0

我首先对字符串运行正则表达式以将“分隔符”更改为“&” - 特别是在“OR”周围可能有额外空格的情况下(在正则表达式中更容易表达,而不是它尝试单独调整/修剪每个术语。然后使用parse_str()你有一个数组,其中每个索引是问题编号,值为“Y”或“N”。

于 2009-07-27T03:05:26.410 回答