2011-09-15 68 views
3

我有一个数据库是这样的:PHP展示最热门的标签

+----+---------------------+ 
| 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 />"; 
} 

} 

这给我虽然一个错误:

Warning: Invalid argument supplied for foreach()

所以我的问题是如何使用此功能显示数据库中最流行的标签?

感谢

回答

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> "; 

} 

谢谢您的帮助虽然

8

我的建议是,你normalize数据库。然后像这样的查询变得微不足道,以及更好的表现。

select TagID, count(*) 
from EntityTag 
group by TagID 
order by count(*) descending 
limit 5 
+0

谢谢你,但是这太复杂了,现在 – 2by

0

mysql_fetch_array返回所有行。所以这样做:

$rows = mysql_fetch_array($result); 
foreach($rows as $row) { 
    $tag_array = $row["tags"]; // note removing the $ 
    foreach(...) { 
    } 
} 
+0

这多少工作,但它不显示任何标签,而不是将其显示是这样的: '(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)' – 2by

+0

对不起,我急匆匆地回复。我会在一分钟内解决这个问题。 –

+0

谢谢,您的新回复给出错误:-) '警告:preg_split()[函数。preg-split]:没有结尾分隔符','发现在' – 2by