2009-07-27 7 views
0

J'ai une liste de questions dans un tableau, dont certaines ne sont affichées que si certains critères sont remplis. Un enregistrement peut avoir des critères aussi simples que 4002 = Y où 4002 est le numéro de la question et Y est la réponse. Si 4002 = Y alors la question doit être affichée.Division d'une chaîne en plusieurs parties

Pour les enregistrements avec un seul critère, je n'ai aucun problème.

Mais il y a des enregistrements qui ont des critères comme les suivants:

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

Dans ce cas, je besoin d'évaluer chaque option pour voir si la question doit être affichée ou non.

D'autres questions auront des chaînes similaires; certains plus courts, d'autres plus longs.

Comment est-ce que je ferais mieux de scinder la chaîne afin que je puisse évaluer chaque section à la fois tout en étant capable de les comparer correctement?

Je peux reformater les données dans une certaine mesure, mais je préférerais ne pas le faire si possible.

Est-ce une tâche regex() (je ne suis pas encore familier)? J'ai essayé list(), split() et explode() avec peu de succès.

Des pointeurs seraient appréciés.

+0

Si je comprends bien votre question, vous voulez faire une scission imbriquée. L'extérieur spécifiant 'OU' comme délimiteur. Utilisez '=' pour l'intérieur. J'essaierais aussi de refactoriser les nombres magiques de la conception. – steamer25

Répondre

3

Si votre chaîne d'entrée est vraiment juste un tas de critères simples séparés par des « OU », puis d'un simple explode() va en effet faire l'affaire:

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

Toutefois, si elle est plus compliquée (si vous permettez ET ainsi que OU, disons) alors vous aurez besoin d'un parser plus intelligent.

+0

Merci, nous avons quelques ANDs là-dedans mais je regarde au-dessus des choses pour m'assurer qu'elles ne sont pas mélangées. Si toutes les questions contiennent seulement des OU ou seulement des AND, je serai OK – Jason

0

vous pouvez essayer

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

Cela suppose le format que vous avez spécifié et je suppose que les valeurs possibles seront soit Y (oui) ou N (non)


$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

J'ai essayé ce qui précède mais je n'ai rien reçu de print_r ($ matches); Est-ce que je manque juste quelque chose? (ou suis-je dense?) – Jason

+0

vient d'être édité pour ajouter le résultat que vous devriez obtenir de print_r. Donc vous n'obtenez pas ça? Même lorsque vous copiez et collez directement ce code? – rezzif

0

Je voudrais d'abord exécuter une regex contre la chaîne pour changer le "séparateur" en "&" - en particulier dans une situation où il peut y avoir des espaces supplémentaires autour de la "OR" (plus facile à exprimer dans regex, que c'est essayer d'ajuster/tr Im chaque terme individuellement. Ensuite, utilisez parse_str() et vous avez un tableau dans lequel chaque index est le numéro de la question et la valeur est "Y" ou "N".

Questions connexes