2009-07-27 248 views
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(),但收效甚微。

任何指针,将不胜感激。

+0

如果我正确理解你的问题,你想做一个嵌套拆分。外部指定'OR'作为分隔符。内部使用'='。我也会尝试重构设计中的神奇数字。 – steamer25 2009-07-27 02:47:39

回答

3

如果您输入的字符串真的只是一堆带分隔的简单标准“OR”,那么一个简单的爆炸()确实会做的伎俩:

$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),那么你将需要一个相应更聪明的解析器。

+0

谢谢,我们确实有一些AND,但我正在查看一些事情以确保它们不会混在一起。如果所有的问题只包含ORs或只包含ANDs,我会好的 – Jason 2009-07-27 15:27:41

0

你可以尝试

if (strpos($record,"OR")!==FALSE){ 
    $s = explode("OR",$record); 
    foreach ($s as $k){ 
     #do something with $k 
    } 
} 
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); 
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 
     ) 

) 

+0

我尝试了上述方法,但是我从print_r($ matches)没有得到任何结果。我只是想念一些东西? (或者我是密集的?) – Jason 2009-07-29 00:12:09

0

我首先针对字符串运行正则表达式,将“分隔符”更改为“&” - 尤其是在“OR”周围可能存在额外空白的情况下(更容易在正则表达式中表示)它是尝试调整/ tr每个学期单独进行。然后使用parse_str(),并且您有一个数组,其中每个索引都是问题编号,值为“Y”或“N”。