PHP показать самые популярные теги - PullRequest
3 голосов
/ 15 сентября 2011

У меня есть такая база данных:

+----+---------------------+
| id | tags                |
+----+---------------------+
| 1  | test1, test2, test3 |
| 2  | test1, test2, test3 |
| 3  | test1, test2, test3 |
| 4  | test1, test2, test3 |
| 5  | buh1, buh2, buh3    |
+----+---------------------+

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

$ tag_array = array ( 'test1, test2 test, test3', 'test2, test4, test2', 'buh, buh2, buh3');

Функция:

function popularTags($tag_array) {
    $p = array();
    foreach($tag_array as $tags) {
        $tags_arr = array_map('trim', explode(',', $tags));
        foreach($tags_arr as $tag) {
            $p[$tag] = array_key_exists($tag, $p) ? $p[$tag]+1 : 1;
        }
    }
    arsort($p);
    return $p;
}

Вот как отобразить самые популярные теги:

foreach(popularTags($tag_array) as $tag=>$num)
{
    echo $tag, " (", $num, ")<br />";
}

Пока это работает с обычным массивом.

Теперь я хочу получить теги из базы данных, поэтому я извлекаю значения из базы данных и запускаю такую ​​функцию:

$result = mysql_query("select * from DB ORDER BY date DESC");

while($row = mysql_fetch_array($result)){

   $tag_array = $row["$tags"];

foreach(popularTags($tag_array) as $tag=>$num)
{
    echo $tag, " (", $num, ")<br />";
}

}

Это дает мне ошибку, хотя:

Предупреждение. В foreach () указан неверный аргумент

Итак, мой вопрос, как показать наиболее популярные теги из базы данных с помощью этой функции?

Спасибо

Ответы [ 3 ]

8 голосов
/ 15 сентября 2011

Я предлагаю вам нормализовать вашу базу данных.Тогда такой запрос становится тривиальным, а также гораздо более эффективным.

select TagID, count(*)
from EntityTag
group by TagID
order by count(*) descending
limit 5
0 голосов
/ 16 сентября 2011

Это работает для меня:

$result = mysql_query("select tags from DATABASE LIMIT 20");

$tags = array();

while ($row = mysql_fetch_array($result)) {
    $row_tag_array = split(",", $row[0]);
    foreach ($row_tag_array as $newtag) {
    asort($row_tag_array);
        if (array_key_exists($newtag, $tags)) {
            if ($tags[$newtag] < 200) {
                $tags[$newtag] = $tags[$newtag] + 20;

            }
        }
        else {
            $tags[$newtag] = 100;
        }
    }
}

foreach ($tags as $tag => $size) {
    echo "<a style=\"font-size: $size%;\" href=\"?t=$tag\">$tag</a> ";

}

Спасибо за вашу помощь, хотя

0 голосов
/ 15 сентября 2011

mysql_fetch_array возвращает все строки.Так сделайте это:

$rows = mysql_fetch_array($result);
foreach($rows as $row) {
    $tag_array = $row["tags"]; // note removing the $
    foreach(...) {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...