php получает только первое вхождение слова из массива
-
05-07-2019 - |
Вопрос
У меня есть массив тегов, которые я извлекаю из базы данных, я экспортирую теги в облако тегов.Я застрял на получении только первого экземпляра 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 - это то, что вы ищете:
Используйте массив_unique функция перед итерацией по массиву?Он удаляет все повторяющиеся строки и возвращает уникальные функции.