Question

Je tire une liste de balises d'une base de données et les exporte dans un nuage de balises. Je suis coincé pour obtenir que la première instance du mot. Par exemple:

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

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

Ceci produirait la balise de test deux fois. Au début, je pensais pouvoir utiliser stristr pour faire quelque chose comme:

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

C’est évidemment une logique idiote qui ne fonctionne pas, stristr ne semble remplacer que la première occurrence de sorte que quelque chose comme "test 123" se débarrasserait seulement du " test " et retournerait " 123 " J'ai vu que cela pouvait aussi être fait avec regex mais je n'ai pas trouvé d'exemple précis de cela.

Merci,
Brooke

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

    $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);
      }
   }
}
Était-ce utile?

La solution

Je suppose que chaque ligne de votre tableau contient plusieurs balises, séparées par un virgule, comme suit:

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

Si c'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);
}

Je ferais remarquer que ce n'est pas efficace.

Une autre option (déjà mentionnée ici) serait d’utiliser les balises comme clés 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)";
}
  • Veuillez garder à l'esprit qu'aucun de ces codes n'a été testé, c'est juste pour que vous compreniez l'idée.

Autres conseils

utilisez array_unique ()

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

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

Utilisez vos mots comme clés du 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 aussi 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'];

Je crois que array_unique de php est ce que vous recherchez:

http://php.net/manual/fr/function.array -unique.php

Utilisez la fonction array_unique avant d'effectuer une itération sur le tableau? Il supprime chaque chaîne en double et renvoie les fonctions uniques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top