Recuperer liste de mot utilisé dans une chaine

mariostar27 Messages postés 442 Statut Membre -  
Pitet Messages postés 2845 Statut Membre -
Bonjour,

Je cherche un algorithme PHP qui me permettrais d'obtenir une liste de mot utilisé dans une chaine et me les retourner sous forme de tableaux.

Je m'explique par un exemple :


$aWord = array('poste', 'type', 'duree', 'situation familiale');

$sString1 = "poste développeur type CDD duree 3 ans situation familiale mariée";
$aWordUsed1 = array('poste', 'type', 'duree', 'situation familiale');

$sString2 = "poste ingenieur poste PDG type CDD duree 3 ans duree 6 ans";
$aWordUsed2 = array('poste', 'poste', 'type', 'duree', 'duree');

Voila l'idée c'est d'avoir un algorithme qui me permettrais de trouver les array $aWordUsed1 et $aWordUsed2 en fonction des chaine de caractères $sString1 et $sString2.

Merci d'avance ^^.



gwennael

3 réponses

  1. Pitet Messages postés 2845 Statut Membre 530
     
    Salut,

    Voici deux exemples de fonction (la deuxième correspond mieux à ce que tu attends : elle retourne toutes les occurrences trouvé dans la chaine et pas seulement la première) :

    function findWords($subject, $searches) {
    	$foundedWords = array();
    
    	foreach ($searches as $wordSearch) {
    		if (strpos($subject, $wordSearch) !== FALSE) {
    			$foundedWords[] = $wordSearch;
    		}
    	}
    	
    	return $foundedWords;
    }
    
    function findWords2($subject, $searches) {
    	$foundedWords = array();
    
    	foreach ($searches as $wordSearch) {
    		$offsetFound = strpos($subject, $wordSearch);
    		
    		while ($offsetFound !== FALSE) {
    			$foundedWords[] = $wordSearch;
    			$offsetFound = strpos($subject, $wordSearch, $offsetFound + strlen($wordSearch));
    		}
    	}
    	
    	return $foundedWords;
    }
    
    $aWord = array('poste', 'type', 'duree', 'situation familiale');
    
    $sString1 = "poste développeur type CDD duree 3 ans situation familiale mariée";
    $sString2 = "poste ingenieur poste PDG type CDD duree 3 ans duree 6 ans";
    
    var_dump(findWords($sString1, $aWord)); 
    // array('poste', 'type', 'duree', 'situation familiale')
    var_dump(findWords($sString2, $aWord)); 
    // array('poste', 'type', 'duree');
    
    var_dump(findWords2($sString1, $aWord)); 
    // array('poste', 'type', 'duree', 'situation familiale')
    var_dump(findWords2($sString2, $aWord)); 
    // array('poste', 'poste', 'type', 'duree', 'duree');
    


    Bonne journée
    0
  2. mariostar27 Messages postés 442 Statut Membre 26
     
    J'ai un problème pour ton cas. Pour :

    $sString2 =
      "poste ingenieur poste PDG type CDD duree 3 ans duree 6 ans poste test";
    


    ta fonction
    findWords2() me retourne ceci :

    array (size=6)
      0 => string 'poste' (length=5)
      1 => string 'poste' (length=5)
      2 => string 'poste' (length=5)
      3 => string 'type' (length=4)
      4 => string 'duree' (length=5)
      5 => string 'duree' (length=5)
    


    Alors que je voudrais ceci :

    array (size=6)
      0 => string 'poste' (length=5)
      1 => string 'poste' (length=5)
      2 => string 'type' (length=4)
      3 => string 'duree' (length=5)
      4 => string 'duree' (length=5)
      5 => string 'poste' (length=5)
    


    Encore merci pour ton aide en tout cas ^^

    gwennael
    0
  3. Pitet Messages postés 2845 Statut Membre 530
     
    Voici la première solution que j'avais commencé à coder :
    function findWords3($subject, $searches) {
    	$foundedWords = array();
    	
    	$wordsSubject = explode(' ', $subject);
    	
    	foreach ($wordsSubject as $word) {
    		if (in_array($word, $searches)) {
    			$foundedWords[] = $word;
    		}
    	}
    	
    	return $foundedWords;
    }
    


    Celle-ci est beaucoup plus simple et correspond au résultat attendu de ton dernier cas, mais elle ne permet pas de chercher plusieurs mots ensemble tel que "situation familiale" -> le cas pour $sString1 ne fonctionne donc pas. Avec cette fonction, il faudrait chercher séparément les mots "situation" et "familiale".

    Sinon voici un autre exemple qui devrait correspondre à tes différents cas :

    
    function findWords4($subject, $searches) {
    	$foundedWords = array();
    	
    	$subjectLenght = strlen($subject);
    	
    	$offsetStart = 0;
    	$i = 0;
    	
    	while ($offsetStart + $i < $subjectLenght) {
    		$i++;
    	
    		$subjectPart = substr($subject, $offsetStart, $i);
    		
    		foreach ($searches as $wordSearch) {
    			if (strpos($subjectPart, $wordSearch) !== FALSE) {
    				$foundedWords[] = $wordSearch;
    				$offsetStart = $offsetStart + $i;
    				$i = 0;
    			}
    		}
    	}
    	
    	return $foundedWords;
    }
    


    Néanmoins cette fonction est moins élégante car beaucoup plus complexe et moins optimisée.

    A toi de choisir et d'adapter celle qui te convient.
    0