Pregunta

Tengo una serie de etiquetas que extraigo de una base de datos, estoy exportando las etiquetas a una nube de etiquetas. Estoy atascado en obtener solo la primera instancia de la palabra. Por ejemplo:

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

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

Esto generaría la etiqueta de prueba dos veces. Al principio pensé que podría usar stristr para hacer algo como:

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

Esto es obviamente una lógica tonta y no funciona, stristr parece reemplazar solo la primera aparición, por lo que algo como "prueba 123" solo se desharía de la " prueba " y devolvería " 123 " He visto que esto también se puede hacer con regex, pero no he encontrado un ejemplo dinámico de eso.

Gracias,
Brooke

Editar: unique_array () funciona si estoy usando una cadena estática pero no funciona con los datos de la base de datos porque estoy usando un ciclo while para obtener los datos de cada filas.

    $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);
      }
   }
}
¿Fue útil?

Solución

Supongo que cada fila de tu tabla contiene más de una etiqueta, separadas por coma, como esta:

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

Si ese es el caso, intente esto:

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

Señalaría que esto no es eficiente.

Otra opción (ya mencionada aquí) sería usar las etiquetas como claves de matriz, con la ventaja de poder contarlas fácilmente.
Podrías hacerlo así:

$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)";
}
  • ten en cuenta que no se probó este código, es solo para que entiendas la idea.

Otros consejos

use array_unique()

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

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

Usa tus palabras como claves del diccionario, no como valores.

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

¡Mientras lo hace, también puede contarlos!

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

Creo que array_unique de php es lo que estás buscando:

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

¿Utiliza la función array_unique antes de iterar sobre la matriz? Elimina cada cadena duplicada y devuelve las funciones únicas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top