我在表格中有一个问题列表,其中一些只有在满足某些条件时才会显示。记录可能有简单的标准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 :(得分:3)
如果你的输入字符串真的只是一堆用“OR”分隔的简单标准,那么一个简单的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,那么)那么你将需要一个相应更智能的解析器。
答案 1 :(得分: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);
答案 2 :(得分:0)
你可以尝试
if (strpos($record,"OR" )!==FALSE){
$s = explode("OR",$record);
foreach ($s as $k){
#do something with $k
}
}
答案 3 :(得分: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
)
)
答案 4 :(得分:0)
我首先对字符串运行正则表达式,将“分隔符”更改为“&” - 特别是在“OR”周围可能有额外空格的情况下(在正则表达式中更容易表达,而不是试图单独调整/修剪每个术语。然后使用parse_str()
并且你有一个数组,其中每个索引都是问题编号,值为“Y”或“N”。