2011-07-14 5 views
1

J'ai un problème qu'il ne peut pas détecter chaque mot dans la chaîne. similaire à filtrer ou une étiquette ou d'une catégorie ou genre de ..

$title = "What iS YouR NAME?"; 

$english = Array('Name', 'Vacation'); 

if(in_array(strtolower($title),$english)){ 
    $language = 'english'; 
} else if(in_array(strtolower($title),$france)){ 
    $language = 'france'; 
} else if(in_array(strtolower($title),$spanish)){ 
    $language = 'spanish'; 
} else if(in_array(strtolower($title),$chinese)){ 
    $language = 'chinese'; 
} else if(in_array(strtolower($title),$japanese)){ 
    $language = 'japanese'; 
} else { 
    $language = null; 
} 
sortie

est nul .. =/

Répondre

2

Pas vraiment de problème ici ... la chaîne de $title ne fait partie d'aucune des baies avec lesquelles vous testez, même en minuscules.

Essayez de tester chaque mot dans chaque onglet de langue par rapport à la chaîne à la place.

$english = Array('Name', 'Vacation'); 
$languages = array('english'=>$english, 
        'france'=>$france, 
        'spanish'=>$spanish, 
        'chinese'=>$chinese, 
        'japenese'=>$japenese); 

while($line = mysql_fetch_assoc($result)) { 
    $title = $line['title']; 
    //$lower_title = strtolower($title); stristr() instead. 

    $language_found = false; 

    foreach($languages as $language_name=>$language) { 
     idx = 0; 
     while(($language_found === false) && idx < count($language)) { 
      $word = $language[$idx]; 
      if(stristr($title, $word) !== false) { 
       $language_found = $language_name; 
      } 
      $idx++; 
     } 
    } 

    // got language name or false... 
} 

Vous pouvez aussi briser la chaîne en utilisant explode bien sûr et tester chaque mot dans le tableau créé pour chaque langue.

+0

cela fonctionne, mais il a donné l'erreur: 'Warning: strpos() [function.strpos]: delimiter vide dans /***.php sur la ligne 47' – user453089

+0

vous avez raison, j'ai dû utiliser 'strstr();' à la place, je vais modifier cela. –

+0

peut-être que l'interpréteur n'aime pas 'if (strstr ($ lower_title, $ word)', je vais modifier à nouveau avec 'if (strstr ($ lower_title, $ word))' ;-) –

2

La sortie est null car la chaîne "what is your name?" n'est pas dans l'un des tableaux de langue. Notez que vous ne devez pas écrire les noms de langue dans le code. Au lieu de cela, un dictionnaire ou un tableau de langues (sous la forme de dictionnaires ou d'objets) permet une future extension et sépare les données de la logique de contrôle.

1

Il y a plusieurs questions logiques:

Le premier problème est que vous essayez de voir si une chaîne multi-mot est dans un tableau de mots simples. Cela échouera toujours à trouver un match. Vous devez rompre $title avec explode et faire une boucle sur les mots.

-à-dire) $title_words = explode(' ', strtolower($title));

foreach($title_words as $word){ 
    //check language 
    //now you can use in_array and expect some matches 
} 

qui présente cependant une deuxième issue.What si un mot est en plusieurs langues?

Un troisième problème est dans votre exemple: vous avez converti votre chaîne de recherche en minuscules, mais votre tableau de correspondances contient tous les mots avec une première lettre majuscule. ie)
$english = Array('Name', 'Vacation'); devrait être
$english = array('name', 'vacation');

si vous attendez correspond

+0

je demande si son possible d'utiliser exploser avec des espaces blancs dans '$ title'? – user453089

+0

va essayer maintenant .. Donnez-moi moins de 5 minutes. – user453089

+0

@ user453089 oui le premier argument de exploser est le délimiteur qui est défini pour casser les chaînes à des espaces blancs –

Questions connexes