Recuperer liste de mot utilisé dans une chaine

Fermé
mariostar27 Messages postés 391 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 21 août 2015 - Modifié par mariostar27 le 22/01/2014 à 13:47
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 22 janv. 2014 à 16:50
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
A voir également:

3 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
22 janv. 2014 à 14:30
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
mariostar27 Messages postés 391 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 21 août 2015 26
Modifié par mariostar27 le 22/01/2014 à 15:10
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
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
22 janv. 2014 à 16:50
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