Pergunta

Eu tenho uma matriz de tags que eu estou puxando a partir de um banco de dados, Estou a exportar as tags para fora em uma nuvem de tags. Eu estou preso em obter apenas a primeira instância da palavra. Por exemplo:

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

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

Esta saída seria a marca de teste duas vezes. No começo eu pensei que eu poderia usar stristr para fazer algo como:

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

Esta é, obviamente lógica bobo e não trabalho, stristr parece apenas para substituir a primeira ocorrência de modo algo como "teste 123" só iria se livrar do "teste" e voltaria "123" Eu vi essa lata também ser feito com regex, mas eu não encontrei uma exmaple dinâmica do que isso.

Obrigado,
Brooke

Editar: obras unique_array() se estou usando uma corda estática, mas não vai trabalhar com os dados do banco de dados, porque eu estou usando um loop while para obter cada linhas de dados.

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

Solução

Estou assumindo que cada linha em sua tabela contém mais de uma tag, separados por coma, como este:

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

Se for esse o caso, tente o seguinte:

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

Eu salientar que este não é eficiente.

Outra opção (já mencionado aqui) seria usar as tags como chaves do array, com a vantagem de ser capaz de contá-los facilmente.
Você poderia fazê-lo como este:

$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)";
}
  • lembre-se nada disto código foi testado, é só assim que você começa a idéia.

Outras dicas

uso array_unique()

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

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

Use suas palavras como chaves para o dicionário, não 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);

Enquanto você está nisso, você também pode contá-los!

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

Eu acredito array_unique do php é o que você está procurando:

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

Use a array_unique função antes de iteração sobre a matriz? Ele remove todas as cordas duplicado e devolver as funções originais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top