Frage

Ich habe eine Reihe von Tags, die ich aus einer Datenbank bin ziehen, ich die Tags am Export in einen Tag-Cloud aus. Ich bin fest auf nur die erste Instanz des Wortes zu bekommen. Zum Beispiel:

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

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

Dies würde die Ausgabe zweimal den Test-Tag. Zuerst dachte ich, ich stristr so etwas wie zu tun verwenden:

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

Das ist natürlich dumm Logik und nicht funktioniert, scheint stristr nur das erste Vorkommen zu ersetzen, so etwas wie „Test 123“ nur die Beseitigung des „tests“ bekommen würde und würde zurückkehren „123“ Ich habe dies gesehen auch mit Regex getan werden, aber ich habe nicht eine dynamische exmaple davon gefunden.

Danke,
Brooke

Edit: unique_array() funktioniert, wenn ich eine statische Zeichenfolge bin mit aber nicht mit den Daten aus der Datenbank arbeiten, weil ich eine While-Schleife bin mit jeweils Reihen Daten zu erhalten.

    $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);
      }
   }
}
War es hilfreich?

Lösung

Ich gehe davon aus, dass jede Zeile in der Tabelle durch Koma mehr als ein Tag, getrennt enthält, wie folgt aus:

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

Wenn das der Fall ist, versuchen Sie dies:

$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);
}

Ich würde darauf hinweisen, dass dies nicht effizient ist.

Eine weitere Option (hier bereits erwähnt) wäre die Tags als Array-Schlüssel zu verwenden, mit dem Vorteil, dass sie leicht zählen.
Man könnte es wie folgt tun:

$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)";
}
  • bitte beachten Sie keines dieser Code getestet wurde, es ist nur so erhalten Sie die Idee.

Andere Tipps

Verwendung array_unique()

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

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

Verwenden Sie Ihre Worte als Schlüssel zum Wörterbuch, nicht als Wert.

$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);

Wenn Sie schon dabei sind, können Sie auch sie zählen!

$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'];

Ich glaube, PHP array_unique ist, was Sie suchen:

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

Mit der array_unique Funktion, bevor sie über das Array iterieren? Es entfernt alle doppelten Zeichenfolge und geben die einzigartigen Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top