2009-07-27 19 views
0

Ich habe eine Liste von Fragen in einer Tabelle, von denen einige nur angezeigt werden sollen, wenn bestimmte Kriterien erfüllt sind. Ein Datensatz könnte so einfache Kriterien wie 4002 = Y haben, wobei 4002 die Nummer der Frage und Y die Antwort ist. Wenn 4002 = Y ist, soll die Frage angezeigt werden.Eine Zeichenfolge in Teile aufteilen

Für Datensätze mit nur einem Kriterium habe ich kein Problem.

Aber dann gibt es Aufzeichnungen, die Kriterien wie die folgenden haben:

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

In diesem Fall würde ich jede Option bewerten müssen, um zu sehen, ob die Frage angezeigt werden soll oder nicht.

Andere Fragen haben ähnliche Strings; einige kürzer, einige länger.

Wie würde ich die Zeichenfolge am besten aufteilen, damit ich jeden Abschnitt auf einmal bewerten kann und immer noch in der Lage bin, sie richtig zu vergleichen?

Ich kann die Daten zu einem gewissen Grad neu formatieren, aber ich würde es vorziehen, wenn überhaupt nicht möglich.

Ist dies eine regex() Aufgabe (ich bin noch nicht sehr vertraut)? Ich habe list(), split() und explode() mit wenig Erfolg versucht.

Alle Hinweise würden geschätzt.

+0

Wenn ich Ihre Frage richtig verstanden habe, möchten Sie eine verschachtelte Aufteilung vornehmen. Der äußere gibt 'OR' als Trennzeichen an. Benutze '=' für den inneren. Ich würde auch versuchen, die magischen Zahlen aus dem Design umzuformen. – steamer25

Antwort

3

Wenn Ihr Eingabestring wirklich nur ein paar einfachen Kriterien ist getrennt mit „OR“, dann einem einfachen explode() wird den Trick tatsächlich tun:

$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"; 
} 

Allerdings, wenn es komplizierter ist (wenn Sie erlaube AND sowie OR, sag) dann brauchst du einen entsprechend smarteren Parser.

+0

Danke, wir haben einige ANDs drin, aber ich schaue mir die Dinge an, um sicherzustellen, dass sie nicht vermischt sind. Wenn alle Fragen nur ORs oder nur ANDs enthalten, bin ich OK – Jason

0

können Sie versuchen,

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

Dies setzt voraus, das Format, das Sie angegeben haben, und ich gehe davon aus, die möglichen Werte werden entweder Y (Ja) oder N sein (no)


$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

Ich versuchte das oben, aber ich bekomme nichts von print_r ($ Matches); Fehle ich gerade etwas? (oder bin ich dicht?) – Jason

+0

gerade bearbeitet, um das Ergebnis zu addieren, das Sie von print_r erhalten sollten. Also bekommst du das nicht? Auch wenn Sie diesen Code direkt kopieren und einfügen? – rezzif

0

Ich würde zuerst eine Regex gegen die Zeichenfolge ausführen, um das "Trennzeichen" in "&" zu ändern - besonders in einer Situation, in der es zusätzliche Leerzeichen um die "ODER" gibt (einfacher ausgedrückt in Regex, als es ist zu versuchen,/tr anzupassen Im jeden Begriff einzeln. Dann verwenden Sie parse_str() und Sie haben ein Array, in dem jeder Index die Frage Nummer und der Wert ist "Y" oder "N".

Verwandte Themen