PHP только получить первое вхождение слова из массива - PullRequest
0 голосов
/ 26 ноября 2009

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

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

Спасибо
Брук

Редактировать: 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);
      }
   }
}

Ответы [ 5 ]

4 голосов
/ 26 ноября 2009

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

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

$getTags = array_unique(explode("," , $string));
foreach ($getTags as $tag ){
   echo($tag);
}
2 голосов
/ 26 ноября 2009

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

$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'];
1 голос
/ 26 ноября 2009

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

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

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

0 голосов
/ 26 ноября 2009

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

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

...