用户
 找回密码
 入住 CI 中国社区
搜索
查看: 10134|回复: 10
收起左侧

[核心代码 Core] php标签云的实现代码

[复制链接]
发表于 2014-2-4 09:11:50 | 显示全部楼层 |阅读模式
本帖最后由 1909264228 于 2014-2-4 09:15 编辑

今天在网上看到的看到的,大家觉得如何????


数据库中,存放文章的表中有“Tag”字段,用来存放标签。标签之间用“,”分隔。比如“PHP,VB,随笔”。
下面的实现代码,将标签从数据库中搜出来,并格式化处理,使其以出现的次数为依据显示出不同大小的文字连接。
其中的细节,不做解释了!
观念陈、方法笨、效率低的标签云的实现代码如下:

  复制代码 代码如下:

PHP复制代码
[/align][/align]  /**
* WNiaoBlog Tag Template ShowTag
*
* @package WNiaoBlog
*
* @subpackage Tag
*/

//Connect the database
//include('../include/config.php');
/**
* CountTag() - Statistics labels appear the number,and the data to be stored in the two array
*
* GetTag() - Access the Tag's Labels from the database
*/

function CountTag($String){
$TagString = $String;
//echo $TagString."
";
$Tags = explode("
,",$TagString);
$n = 1;
$i = 0;
$Continue = TRUE;
//echo $Tags[1]."

";
//in case no-label's article
while($Tags[$n] OR $Tags[++$n] OR $Tags[++$n] ){
$EachTag = $Tags[$n++];
//echo $EachTag."

";
$Continue = TRUE;
for($i=0;$Continue;$i++){
if( $EachTagStr[$i][0] ) {
if( $EachTagStr[$i][0] == $EachTag ){
$EachTagStr[$i][1]++;
$Continue = FALSE;
}
else {
if( $EachTagStr[$i+1][0] ) $Continue = TRUE;
else {
$EachTagStr[$i+1][0] = $EachTag;
$EachTagStr[$i+1][1] = 1;
$Continue = FALSE;
}
}
} else { //initialize the array $EachTagStr[][]
$EachTagStr[$i][0] = $EachTag;
$EachTagStr[$i][1] = 1;
$Continue = FALSE;
}
}
}
return $EachTagStr;
}
function ShowTag($Row,$ablink){
$i = 0;
while($Row[$i][0]){
$EachTag = $Row[$i][0];
$EachCount = $Row[$i][1];
$Size = SetSize($EachCount);
echo "
< a style='color:BLUE ; font-size:".$Size." ' onMouseOver=lor='#900000' onMouseOut=lor='BLUE' .$ablink."tag?tag=".$EachTag."' target='_self' > ".$EachTag."(".$EachCount.")"." ";
$i++;
}
}
function GetTag(){
$QuerySet = mysql_query("select * from article");
while($Row = mysql_fetch_array($QuerySet)){
$Tag = $Row['tag'];
$TagString = $TagString.",".$Tag;
}
return $TagString;
}
function SetSize($Size){
$Size += 10;
if($Size > 30)
$Size = 30;
return $Size;
}
//Go
echo "
"
;
echo "标签云";
$String = GetTag();
$Row = CountTag($String);
ShowTag($Row,$ablink);
echo "
"
;
?>
 
 
 
复制代码




 楼主| 发表于 2014-2-4 09:36:38 | 显示全部楼层
PHP复制代码
 
数据库中,存放文章的表中有“Tag”字段,用来存放标签。标签之间用“,”分隔。比如“PHP,VB,随笔”。
下面的实现代码,将标签从数据库中搜出来,并格式化处理,使其以出现的次数为依据显示出不同大小的文字连接。
其中的细节,不做解释了!
观念陈、方法笨、效率低的标签云的实现代码如下:
  复制代码 代码如下:
 
<?
 
/**
 * Project:     EXCMS: the PHP content management system.
 * File:        tag.php
 * A product of SINOICAN Inc.
 * EXCMS is a ten million data-level,high speed,human-based content management system.
 * EX is Excellence & Express & Exceed & Expert.
 * For questions, help, comments, discussion, please join the
 * EXCMS mailing list. Send a blank e-mail to
 * excms@sinoican.com
 * or join the EXCMS forum
 * www.excms.cn/forum
 * @link http://www.excms.cn/
 * @copyright Copyright (c) 2007-2009 SINOICAN Inc.
 * @license http://www.excms.cn/licenses/LICENSE-1.0
 * @category EXCMS
 * @author hukuizhi
 * @version $Rev: 58 $
 */

 /* $Id: tag.php 58 2009-11-03 02:31:37Z hukuizhi $ */
 /**
  * TAG标签封面及列表程序
  */

//加载系统配置文件,移动本程序时,请修改配置文件路径
require_once ('configuration/inc/common.inc.php');
//获取页面参数
$name = trim($_GET['name']);
$type = trim($_GET['type']);
$_PAGE['pageon'] = (int)$_GET['page'];
//当前位置
$split_str = " {$EXCMS['list_symbol']} ";
$_PAGE['position'] = "<a href='{$EXCMS['domain']}'>{$EXCMS['home_link_txt']}</a>";
//定义页面模板
$tpl = 'tag.html';
if ($name != '') { //显示tag列表
    excms_import('EXCMS.content.Tag');
    $tag = new Tag();
    if($type == 'pinyin'){
        $name = iconv('UTF-8', 'GBK', $name);
 
    }
 
    $_PAGE['thisTag'] = $tag->getByName($name);
 
    if(!(is_array($_PAGE['thisTag']) && count($_PAGE['thisTag']))){
 
        echo "不存在的Tag:$name";exit();
 
    }
 
    //增加点击量
    $tag->clickUp($_PAGE['thisTag']['tagid']);
 
    $_PAGE['type'] = $type;
 
    if($type == 'pinyin'){
 
        $tagContentIds = $tag->getContentIdsByName($name);
        $tagIdArray = explode(',',$tagContentIds);
 
        if(count($tagIdArray)<6){
 
            rsort($tagIdArray);
 
            excms_import('EXCMS.content.Content');
 
            $content = new Content();
 
            excms_import('EXCMS.update.ContentFunction');
 
            $content_array = $content->getById($tagIdArray[0]);
 
            $url = ContentFunction::getContentUrl($content_array);
 
            header("HTTP/1.1 301 Moved Permanently");
 
            header("Location:".$url);
 
            exit();
 
        }
 
    }
 
    unset($tag);
 
    $_PAGE['name'] = $name;
 
    //当前位置
 
    $_PAGE['position'] .= $split_str . $name;
 
    $tpl = 'taglist.html';
}
 
//显示
 
excms_func_templateDisplay($tpl);
?>
 
 
复制代码

 楼主| 发表于 2014-2-4 16:23:52 | 显示全部楼层
本帖最后由 1909264228 于 2014-2-4 23:32 编辑

PHP热门标签云 如何实现标签云的显示 要求是显示在5天之内点击数最高的10个热门标签  不是总点击数最高的10个 而是5天之内的点击数最高的10个 总点击数另有用处 如何实现

PHP+mysql 数据库应该如何设置  算法如何写?比如有100个标签 我要求 求出在5天之内这些标签里点击数最高的10条出来 不是总点击数啊 是这5天内的总点击数最高的10条

需要两个表
1,标签表
id(int 10 auto_increment),tag(varchar 50),click(mediumint 6)
2,点击表
id(int 10 auto_increment),tid(int 10),clicktime(int 10)

tid关联标签表id
clicktime 放的是时间戳,php中time()函数返回的整数就是,如:1272249242

$sql="select count(C.id) as cid,tag,tid from 点击表 C
left join 标签表 T on T.id=C.tid
where clicktime>五天前的时间戳  
group by tid
order by cid desc
limit 10";

 楼主| 发表于 2014-2-4 16:30:47 | 显示全部楼层
PHP创建标签云

function getCloud( $data = array(), $minFontSize = 12, $maxFontSize = 30 )  
{  
$minimumCount = min( array_values( $data ) );  
$maximumCount = max( array_values( $data ) );  
$spread = $maximumCount – $minimumCount;  
$cloudHTML = ”;  
$cloudTags = array();  

$spread == 0 && $spread = 1;  

foreach( $data as $tag => $count )  
{  
$size = $minFontSize + ( $count – $minimumCount )  
* ( $maxFontSize – $minFontSize ) / $spread;  
$cloudTags[] = ‘<a style=”font-size: ‘ . floor( $size ) . ‘px’  
. ‘” href=”#” title=”\” . $tag .  
‘\’ returned a count of ‘ . $count . ‘”>’  
. htmlspecialchars( stripslashes( $tag ) ) . ‘</a>’;  
}  

return join( “\n”, $cloudTags ) . “\n”;  
}  
/**************************  
**** Sample usage ***/
$arr = Array(‘Actionscript’ => 35, ‘Adobe’ => 22, ‘Array’ => 44, ‘Background’ => 43,  
‘Blur’ => 18, ‘Canvas’ => 33, ‘Class’ => 15, ‘Color Palette’ => 11, ‘Crop’ => 42,  
‘Delimiter’ => 13, ‘Depth’ => 34, ‘Design’ => 8, ‘Encode’ => 12, ‘Encryption’ => 30,  
‘Extract’ => 28, ‘Filters’ => 42);  
echo getCloud($arr, 12, 36);
 楼主| 发表于 2014-2-4 23:38:57 | 显示全部楼层
本帖最后由 1909264228 于 2014-2-4 23:44 编辑

php mysql实现标签云的实例代码    现在php标签云效果很流行的,这里分享一段php代码,构造出一段奇妙的php 标签云效果。有需要的朋友参考下吧。
php与mysql结合实现的标签云效果,完整代码,如下:
  <?php /**  *
* php与mysql实现的标签云效果
*/

$db_host = "localhost";
$db_user = "db_user";
$db_pass = "pass";  
$db_name = "db_name";   
mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
mysql_select_db($db_name);   
function tag_info() {     
$result = mysql_query("SELECT * FROM tags GROUP BY tag ORDER BY count DESC");   
while($row = mysql_fetch_array($result)) {      
     $arr[$row['tag']] = $row['count'];   }     
ksort($arr);   
return $arr;  }   
function tag_cloud() {      
$min_size = 10;     
$max_size = 30;      
$tags = tag_info();      
$minimum_count = min(array_values($tags));     
$maximum_count = max(array_values($tags));     
$spread = $maximum_count - $minimum_count;      
if($spread == 0) {         $spread = 1;     }  
    $cloud_html = '';     
$cloud_tags = array(); // create an array to hold tag code     
foreach ($tags as $tag => $count) {         
$size = $min_size + ($count - $minimum_count)* ($max_size - $min_size) / $spread;         
$cloud_tags[] = '<a style="font-size: '. floor($size) . 'px'.'" class="tag_cloud" target="_blank" href="http://www.jbxue.com/index.php?s=' . $tag. '" title="\'' . $tag  . '\' returned a count of ' . $count . '">'. htmlspecialchars(stripslashes($tag)) . '</a>';     }      
$cloud_html = join("\n", $cloud_tags) . "\n";
return $cloud_html; } ?>   

2,css样式表 代码示例:  
<style type="text/css">
.tag_cloud {padding: 3px; text-decoration: none;  font-family: verdana;  }  
.tag_cloud:link  { color: #FF66CC; } .tag_cloud:visited { color: #9900FF; }  
.tag_cloud:hover { color: #FF66CC; background: #000000; }
.tag_cloud:active { color: #6699FF; background: #000000; } </style>  

3,显示标签云的区域 代码示例:  <div id="wrapper">   <?php print tag_cloud(); ?> </div>
 楼主| 发表于 2014-2-4 23:50:29 | 显示全部楼层
php中如何将日志和标签一起写入MYSQL数据库
最近遇到一个问题,比如你要发表一篇文章,而文章可以带有标签:
mysql数据库中放有两个表:
日志信息表:d_blog
blog_id mediumint(8)   UNSIGNED nuo null  auto_increment               
content longtext gbk_chinese_ci  
标签表:
d_tag:
tag_id mediumint(8)   UNSIGNED 否  auto_increment               
  tagname varchar(60) gbk_chinese_ci  否                 
  blog_id text   not null
就是在插入日志的同时是如何把标签插入数据库中,
当然插入数据中是简单,关键是d_tag中blog_id是如何被写入数据库的,blog_id是自动增加,还没有被创建,默认为Null,那么在d_tag就确定不了一个标签中到底有什么日志了,因为d_tag中gid是个空白,不知道哪位大侠说说,新手学php,啦,谢谢哈



你可以再标签表中和日志信息表中添加一个名字相同的字段,这样就可以把这两个表给关联起来了。



 楼主| 发表于 2014-2-5 00:08:38 | 显示全部楼层
PHP+MYSQL如何插入记录到数据库

INSERT INTO语句的作用是:向一个数据库的表中插入一条新的记录。 向一个数据库表中插入数据 INSERT INTO的作用是:向一个数据库的表中插入一条新的记录。 语法 INSERT INTO table_name VALUES (value1, value2,....) 你可以在指定的列中插入数据,具体如下
“INSERT INTO”语句的作用是:向一个数据库的表中插入一条新的记录。
向一个数据库表中插入数据
“INSERT INTO”的作用是:向一个数据库的表中插入一条新的记录。
语法
INSERT INTO table_name
VALUES (value1, value2,....)
你可以在指定的列中插入数据,具体如下:
INSERT INTO table_name (column1, column2,...)
VALUES (value1, value2,....)
注意:SQL语句是“字母大小写不敏感”的语句(它不区分字母的大小写),即:“INSERT INTO”和“insert into”是一样的。
在PHP内创建数据库,我们需要在mysql_query()函数内使用上述语句。这个函数是用来发送MySQL数据库连接建立的请求和指令的。
案例
在前一章里,我们建立了一张名为“Person”的表,其中包含三个纵列:"Firstname", "Lastname" 和 "Age"。在下面的案例当中,我们还会用到同一张表,并在其中加入两条新的记录:
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }mysql_select_db("my_db", $con);mysql_query("INSERT INTO person (FirstName, LastName, Age)
VALUES ('Peter', 'Griffin', '35')");mysql_query("INSERT INTO person (FirstName, LastName, Age)
VALUES ('Glenn', 'Quagmire', '33')");mysql_close($con);
?>
把一张表中的数据插入数据库中
现在,我们将建立一个HTML表单;通过它我们可以向“Person”表中加入新的记录。
下面演示这个HTML表单:
<html>
<body><form action="insert.php" method="post">
Firstname: <input type="text" name="firstname" />
Lastname: <input type="text" name="lastname" />
Age: <input type="text" name="age" />
<input type="submit" />
</form></body>
</html>
在上述案例中,当一个用户点击HTML表单中的“提交submit”按钮后,表单中的数据会发送到“insert.php”。“insert.php”文件与数据库建立连接,并通过PHP $_POST变量获取表单中的数据;此时,mysql_query()函数执行“INSERT INTO”语句,这样,一条新的记录就被添加到数据库的表单当中了。
下面试“insert.php”页面的代码:
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }mysql_select_db("my_db", $con);$sql="INSERT INTO person (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";mysql_close($con)
?>
 楼主| 发表于 2014-2-5 00:15:59 | 显示全部楼层
blog中的tag用PHP怎么实现
文章表(文章ID[,...])
标签表(标签ID, 标签名)
关系表(关系ID, 文章ID, 标签ID)
以新增一篇文章为例,指定两个tag,约定以半角逗号隔开:A,B。其中,A已存在标签表,B不存在。
[ol]
  • $tags = explode(,’, $_POST[\'article_tag\']);
  • /*{插入文章}*/
  • $article_id = mysql_insert_id();
  • foreach ($tags as $tag) {
  • ? ? if (/*{标签已存在}*/) {
  • ? ?? ???$tag_id = /*{取标签ID}*/;
  • ? ? } else {
  • ? ?? ???/*{新增标签}*/
  • ? ?? ???$tag_id = mysql_insert_id();
  • ? ? }
  • ? ? /*插入*/
  • }
  • [/ol]
  •  楼主| 发表于 2014-2-5 00:24:13 | 显示全部楼层
    这样:TAG就是一篇文章的关键字。说什么分类也可以这么说,无非就是归类作用。

    什么自增分类。发布文章时去判断吧,存在已有tag返回tagid,不存在,创建后再返回tagid

    一般是设置成两个表,一个表记录tag信息表,一个表记录存在这个TAG的文章ID表

    查询的时候,传入tagid 去查第二个表,就查出这个tag 下的相关文章了。
    发表于 2014-2-9 21:35:50 | 显示全部楼层
    留着学习学习。。

    本版积分规则