2009-11-25 6 views
0

J'ai un tableau d'étiquettes que je tire d'une base de données, j'exporte les étiquettes dans un nuage de tags. Je suis bloqué sur obtenir seulement la première instance du mot. Par exemple:php obtient seulement la première occurrence d'un mot d'un tableau

$string = "test,test,tag,tag2,tag3"; 

$getTags = explode("," , $string); 
    foreach ($getTags as $tag){ 
    echo($tag); 
    } 

Cela produirait l'étiquette de test deux fois. Au début, je pensais que je pouvais utiliser stristr faire quelque chose comme:

foreach ($getTags as $tag){ 
     $tag= stristr($tag , $tag); 
     echo($tag); 
    } 

Ceci est évidemment logique stupide et ne fonctionne pas, stristr semble ne remplacer la première occurrence donc quelque chose comme « test 123 » ne ferait que se débarrasser du "test" et retournerait "123" J'ai vu cela peut aussi être fait avec regex mais je n'ai pas trouvé d'exemple dynamique de cela.

Merci,
Brooke

Edit:unique_array() fonctionne que si j'utilise une chaîne statique, mais ne fonctionnera pas avec les données de la base de données car j'utilise une boucle while pour obtenir chaque rangs Les données.

$getTag_data = mysql_query("SELECT tags FROM `news_data`"); 
if ($getTag_data) 
{ 

    while ($rowTags = mysql_fetch_assoc($getTag_data)) 
    { 
    $getTags = array_unique(explode("," , $rowTags['tags'])); 
     foreach ($getTags as $tag){ 
     echo ($tag); 
     } 
    } 
} 

Répondre

1

Je suppose que chaque ligne de votre table contient plus d'une étiquette, séparés par des virgules, comme ceci:

Row0: php, regex, stackoverflow 
Row1: php, variables, scope 
Row2: c#, regex 

Si tel est le cas, essayez ceci:

$getTag_data = mysql_query("SELECT tags FROM `news_data`"); 

//fetch all the tags you found and place it into an array (with duplicated entries) 
$getTags = array(); 
if ($getTag_data) { 
    while ($row = mysql_fetch_assoc($getTag_data)) { 
    array_merge($getTags, explode("," , $row['tags']); 
    } 
} 

//clean up duplicity 
$getTags = array_unique($getTags); 

//display 
foreach ($getTags as $tag) { 
    echo ($tag); 
} 

I Dites que cela n'est pas efficace.

Une autre option (déjà mentionnée ici) consisterait à utiliser les étiquettes comme des touches de tableau, avec l'avantage de pouvoir les compter facilement.
Vous pouvez le faire comme ceci:

$getTag_data = mysql_query("SELECT tags FROM `news_data`"); 

$getTags = array(); 
if ($getTag_data) { 
    while ($row = mysql_fetch_assoc($getTag_data)) { 
    $tags = explode("," , $row['tags']); 
    foreach($tags as $t) { 
     $getTags[$t] = isset($getTags[$t]) ? $getTags[$t]+1 : 1; 
    } 
    } 
} 

//display 
foreach ($getTags as $tag => $count) { 
    echo "$tag ($count times)"; 
} 
  • s'il vous plaît garder à l'esprit aucun de ce code a été testé, il est juste si vous obtenez l'idée.
+0

Merci qui a fonctionné, j'ai dû ajouter '$ t = trim ($ t);' à l'intérieur de la boucle foreach qui définissait les clés comme "test" était différent de "test". Merci pour l'aide! – BandonRandon

4

utilisation array_unique()

$string = "test,test,tag,tag2,tag3"; 

$getTags = array_unique(explode("," , $string)); 
foreach ($getTags as $tag){ 
    echo($tag); 
} 
+0

Cela semble fonctionner à la lecture du manuel PHP. Cela fonctionne si j'utilise une chaîne statique mais pas si je tire les données d'une base de données MySQL. Je pense que c'est peut-être parce que je tire de plusieurs rangées et que j'explose chaque rangée. – BandonRandon

2

Utilisez vos mots clés dans le dictionnaire, et non comme valeurs.

$allWords=array() 
foreach(explode("," , $string) as $word) 
    $allWords[$word]=true; 
//now you can extract these keys to a regular array if you want to 
$allWords=array_keys($allWords); 

Pendant que vous y êtes, vous pouvez également les compter!

$wordCounters=array() 
foreach(explode("," , $string) as $word) 
{ 
    if (array_key_exists($word,$wordCounters)) 
    $wordCounters[$word]++; 
    else 
    $wordCounters=1; 
} 

//word list: 
$wordList=array_keys($wordCounters); 

//counter for some word: 
echo $wordCounters['test']; 
+0

Ceci est le gagnant, IMO. Devrait être le plus rapide, aussi. –

0

Utilisez la fonction array_unique avant itérer sur le tableau? Il supprime toutes les chaînes en double et renvoie les fonctions uniques.

Questions connexes