2015-10-14 2 views
1

J'essaie de vérifier si une chaîne est PANGRAM mais les deux codes donnent des résultats différents.
Pourquoi n'ai-je pas la même sortie?

Number One -

<?php 
$line = strtolower(trim("thequickbrownfoxjumpsoverthelazydog")); 
$letters = str_split("thequickbrownfoxjumpsoverthelazydog"); 
$result = "pangram"; 

foreach ($letters as $value) { 
    if (strstr($line, $value) == FALSE) { 
     $result = "not pangram"; 
    } 
} 
echo $result; 
?> 

Number Two -

<?php 
$line = strtolower(trim("thequickbrownfoxjumpsoverthelazydog")); 
$letters = str_split("thequickbrownfoxjumpsoverthelazydog"); 
$result = "not pangram"; 
foreach ($letters as $value) { 
    if (strstr($line, $value) == TRUE) { 
     $result = "pangram"; 
    } 
} 

echo $result; 
?> 
+1

La deuxième version est erronée, car elle définit 'result' de $ à' pangram' dès qu'il trouve une seule lettre correspondant. Mais c'est seulement un pangram si ** chaque ** lettre est trouvée. – Barmar

+0

Que voulez-vous dire par "prédicats" dans ce contexte? – Barmar

Répondre

0

La deuxième version est incorrecte car vous ne pouvez pas déterminer qu'une phrase est un pangram basé sur la vérification d'un seul caractère de l'alphabet. Donc, trouver un personnage correspondant ne signifie pas que c'est un pangram. La seule chose que vous pouvez faire est de déterminer qu'une phrase est et non un pangram lorsque l'une des lettres de l'alphabet et non existe dans la chaîne de test. Donc, vous devez commencer par l'hypothèse que c'est un pangram, rechercher chaque lettre, et quand une recherche échoue, vous concluez que ce n'est pas le cas.

Vous pouvez également arrêter la boucle une fois que cela arrive - un échec suffit à conclure qu'il ne s'agit pas d'un pangram.

foreach ($letters as $letter) { 
    if (!strstr($line, $letter)) { 
     $result = "not pangram"; 
     break; 
    } 
} 
+0

Génial! Je l'ai eu :) Merci un million! –

0

Vous devez utiliser prédicats, sinon le résultat pourrait changer à chaque tick de l'itération:

$line = strtolower(trim("thequickbrownfoxjumpsoverthelazydog")); 
$letters = str_split("thequickbrownfoxjumpsoverthelazydog"); 
$result = true; 
foreach ($letters as $value) { 
    $result = $result && strstr($line, $value); 
} 

echo $result ? "pangram" : "not pangram"; 

Avec votre code, si la première lettre est trouvée, le résultat sera TRUE, mais si le suivant n'est pas trouvé, il sera FALSE, et, si le troisième est trouvé, il sera à nouveau TRUE, et ainsi de suite.

1

très simple panagram vérifier le code

$string = "The quick brown fox jumps over the lazy dog"; 
$stringData = str_split(strtolower($string)); 
$check = range('a', 'z'); 
$res = array_intersect($check, $stringData); 
if(count($check) === count($res)) echo 'panagram'; 
else echo 'not panagram'; 

thats it

+0

Fonctionne magnifiquement – JMP