2009-10-02 7 views
1

J'ai une longue chaîne et un tableau de noms de pays. Donc le tableau ressemble à ceci:Comment compter les occurrences de plusieurs modèles dans une chaîne longue?

array('Afghanistan', 'Bulgaria', 'United States', 'Bulgaria', ...) 

Je dois compter le nombre de fois que chaque pays apparaît dans la chaîne. Y a-t-il une manière rapide et astucieuse de faire cela, c'est-à-dire une sorte de preg_match_all magique qui reçoit un éventail de modèles, ou dois-je parcourir tous les pays?

+0

pour l'enregistrement, un tableau est pas une chaîne. Ce sont deux questions très différentes. – GSto

+0

Je crois qu'il est conscient de cela, il a un tableau et une grande chaîne. – Lizard

+0

Faites attention aux phrases comme: «En Bulgarie, on appelle les Bulgares». Vous pouvez compter le mot «Bulgarie» deux fois alors qu'une seule fois pourrait être désirée. –

Répondre

1

Vous pouvez utiliser quelque chose comme:

$country_names = array('Afghanistan', 'Bulgaria', 'United States', ...); 
$country_names_preg = "/(" . implode("|", $country_names) . ")/"; 
preg_match_all($country_names_preg, $long_string, $matches); 

//$matches will contain all of the country matches. 
$echo "found: " . implode(", ", $matches); 

// There would ideally be a check to make sure that $matches had something in it! 
0

Je ne pense pas que vous pouvez le faire avec un appel, mais pendant que vous itérez à travers substr_count() peut être plus rapide que preg_ * à cet effet.

3

Je venais d'utiliser une table de hachage (tableau associatif) et boucle à travers vos pays:

// Count: 
$country_names = array('Afghanistan', 'Bulgaria', 'United States', ...); 
$country_count = array(); 
foreach ($country_names as $name) { 
    $country_count[$name]++; 
} 

// Then display: 
foreach ($country_names as $name) { 
    echo "Found " . $country_count[$name] . " occurrences of $name.\n"; 
} 
+2

Je ne suis pas sûr que c'est ce qu'il a après ... Je pense qu'il a une chaîne avec beaucoup d'autres textes et veut compter l'occurance de chaque pays dans cette chaîne. – Lizard

+0

pourtant c'est brillant – slikts

2

Si vous voulez quelque chose extrêmement rapide (mais pas rapide à mettre en œuvre), envisager Aho Corasick's algorithm. Here est une implémentation en PHP.

2

Essayez d'utiliser substr_count http://us3.php.net/manual/en/function.substr-count.php

$yourtmplongstring = strtolower($yourlongstring); 
# the above will solve any case sensitive issues 
$country_names = array('Afghanistan', 'Bulgaria', 'United States', ...); 
$country_count = array(); 
foreach ($country_names as $name) { 
    $occurances = substr_count($name, $yourtmplongstring); 
    $country_count[$name] = $occurances; 
} 

J'espère que c'est ce que vous recherchez!

+1

Merci, ça marcherait - mais c'est sensible à la casse. Donc, si j'ai BULGARIE dans le texte, ça ne va pas fonctionner. – Sleepster

+0

faire un strtolower() avant. – Toto

+0

S'il vous plaît vérifier ma modification car cela permettrait de résoudre vos problèmes sensibles à la casse. – Lizard

Questions connexes