php получает только первое вхождение слова из массива

StackOverflow https://stackoverflow.com/questions/1800282

Вопрос

У меня есть массив тегов, которые я извлекаю из базы данных, я экспортирую теги в облако тегов.Я застрял на получении только первого экземпляра word.Например:

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

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

Это привело бы к выводу тестового тега дважды.сначала я подумал, что мог бы использовать stristr чтобы сделать что-то вроде:

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

Это явно глупая логика и она не работает, stristr кажется, заменяет только первое вхождение, поэтому что-то вроде "test 123" только избавит от "test" и вернет "123" Я видел, что это также можно сделать с помощью regex, но я не нашел динамического примера этого.

Спасибо,
Брук

Редактировать: unique_array() работает, если я использую статическую строку, но не будет работать с данными из базы данных, потому что я использую цикл while для получения данных каждой строки.

    $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);
      }
   }
}
Это было полезно?

Решение

Я предполагаю, что каждая строка в вашей таблице содержит более одного тега, разделенного символом coma, вот так:

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

Если это так, попробуйте это:

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

Я бы хотел отметить, что это неэффективно.

Другим вариантом (уже упомянутым здесь) было бы использовать теги в качестве ключей массива, с тем преимуществом, что их можно легко подсчитать.
Вы могли бы сделать это вот так:

$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)";
}
  • пожалуйста, имейте в виду, что ни один из этих кодов не был протестирован, это просто для того, чтобы вы поняли идею.

Другие советы

использование array_unique()

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

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

Используйте свои слова как ключи к словарю, а не как значения.

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

Пока вы этим занимаетесь, вы также можете их посчитать!

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

Я считаю, что php array_unique - это то, что вы ищете:

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

Используйте массив_unique функция перед итерацией по массиву?Он удаляет все повторяющиеся строки и возвращает уникальные функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top