2009-07-27 294 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」。