我有一个这样的数据库:
+----+---------------------+
| 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()提供的参数无效
所以我的问题是如何使用此功能显示数据库中最受欢迎的标签?
由于
答案 0 :(得分:8)
我的建议是你normalize你的数据库。然后像这样的查询变得微不足道,并且表现要好得多。
select TagID, count(*)
from EntityTag
group by TagID
order by count(*) descending
limit 5
答案 1 :(得分:0)
mysql_fetch_array返回所有行。所以这样做:
$rows = mysql_fetch_array($result);
foreach($rows as $row) {
$tag_array = $row["tags"]; // note removing the $
foreach(...) {
}
}
答案 2 :(得分:0)
这个适用于我:
$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> ";
}
感谢您的帮助