请教用文本统计点击数并按点击数排序的问题!(属于编程问题吧)

tq85 2004-04-10 11:58:20
我的思路是
count3.txt
存放数据格式为
统计id|统计的点数
没行格开!
首先将count3.txt文件读出来
在for循环中
list($cidi,$readcounti)=explode("|",$arr[$i]);
然后赋值给
$cid[$i]=$cidi;
$readcount[$i]=$readcounti;
$cid [] $readcount[] 这两个数组
然后在当前循环下判断
if $cid[$i]==$ID 则$readcount[$i]++
然后开始排序
通过比较自加后的$readcount[$i]比较这个给提前排序!
结果就在这里出问题了!
好象我这个想法就有问题!

本来是应该排好序后在for循环一次将两个数组依次写入文件的!
我添加了echo输出的代码:
<?php

echo "\$_GET['id']:".$_GET['id']."<BR>";
addcountid($_GET['id']);


function addcountid($ID){
echo "\$ID:".$ID."<BR>";
$arr=file("count3.txt");
$counter=count($arr);
echo "\$counter:".$counter."<BR>";
$fp=fopen("count3.txt","w");
flock($fp,LOCK_EX);
for($i=0;$i<$counter;$i++){
list($cidi,$readcounti)=explode("|",$arr[$i]);
$cid[$i]=$cidi;
$readcount[$i]=$readcounti;
echo "\$cid[".$i."]:".$cid[$i]."<BR>";
echo "\$readcount[".$i."]:".$readcount[$i]."<BR>";
if($cid[$i]==$ID)
{$readcount[$i]++;
echo "if(\$cid[\$i]==\$ID) <BR>";
echo "\$readcount[".$i."]:".$readcount[$i]."<BR>";
$READCOUNT=$readcount[$i];
$addmark=1;
for($j=$i;$j>=$i;$j--){
echo "\$j:".$j."<BR>";
if($READCOUNT==$readcount[$j]) {
echo "\$cid[\$j+1]:\$cid[".$j."]:".$cid[$j+1]."<BR>";
$cid[$i]=$cid[$j+1];
echo "\$cid[".$i."]:".$cid[$i]."<BR>";
echo "\$readcount[\$j+1]:\$readcount[".$j."]:".$readcount[$j+1]."<BR>";
$readcount[$i]=$readcount[$j+1];
echo "\$readcount[".$i."]:".$readcount[$i]."<BR>";
$cid[$j+1]=$ID;
echo "\$cid[\$j+1]:\$cid[".$j."]:".$cid[$j]."<BR>";
$readcount[$j+1]=$READCOUNT;
echo "\$readcount[\$j+1]:\$readcount[".$j."]:".$readcount[$j+1]."<BR>";
}
}
}
//fputs($fp,$arr[$i]."\r\n");
//else {fputs($fp,$cid."|".$readcount++."\r\n");$READCOUNT=$readcount;$addmark=1;
}
for($i=0;$i<$counter;$i++){
echo $cid[$i]."|".$readcount[$i]."<BR>";
fputs($fp,$cid[$i]."|".$readcount[$i]);
}
if($addmark!=1) {
fputs($fp,$ID."|1");
$READCOUNT=1;
}
flock($fp,LOCK_UN);
fclose($fp);
return($READCOUNT);
}
?>

一开始我是打算在for循环中
list($cidi,$readcounti)=explode("|",$arr[$i]);
后直接往文件里写写如
fputs($fp,$cidi."|".$readcounti);
如果碰到$readcouti++则将文件指针fseek几行来从中间插入新记录。
可是发现fseek是按字节offset的,而不是行数,而因为我点击数位数不定,不知道计算offset

请高手指点!我编程水平比较差……希望高手在写算法给我的时候最好能把代码写给我看看好吗?!
分不够再加……
...全文
6 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
52juanjuan 2004-04-11
up
回复
ice_berg16 2004-04-11
学习
回复
tq85 2004-04-11
突然明白了
sort会把数组下标弄成
0123之类的

arsort()
且不加flag就好了……
结帖子!
回复
hahawen 2004-04-11
你的这个想法不好:
统计id|统计的点数 读完后应该构成数组:$aaa['统计id']=统计的点数;

function addcountid($ID){
$arr=file("count3.txt");
foreach($arr as $str){
list($key, $value) explode('|', $str);
$result[$key] = $value;
}
if(isset($result[$ID]))
$result[$ID] = 1;
else
$result[$key]++;
rsort($result,SORT_NUMERIC);
$resultStr = '';
foreach($result as $key=>$value)
$resultStr .= "$key|$value\n";
file_put_contents('count3.txt', $resutlStr);
}
回复
tq85 2004-04-11
100029|1
|
100029|1

大虾你给的第二个也有点问题?!
初始化会成那样
去掉初始化的原因好象也有些问题
我手工初始化后好象能加,但是……
100029|2
100035|1
100030|1
100035|1

还没具体看是怎么回事
chinaworker(网络混混 Hrcn.CN)
谢谢给的排序函数,原来手册里有那么多东西我没注意过……
我想试试看……
回复
tq85 2004-04-11
非常谢谢大虾

不过这句好象有点小问题!
if(isset($result[$ID]))
我想应该是
if(!isset($result[$ID]))吧,没定义的变量就增加记录,可是好象总是达不到效果……
晕呀!高手看看怎么回事好吗?!
我用的是id=1000456
这样稍微特殊的id!
第一次初始化后会是
0|1
然后依次类推
1|1
2|1
并不能写入$ID
而且还有一些比较多的回车……
<?php

echo "\$_GET['id']:".$_GET['id']."<BR>";
addcountid($_GET['id']);

function addcountid($ID){
$arr=file("count3.txt");
foreach($arr as $str){
list($key, $value) = explode('|', $str);
$result[$key] = $value;
echo "\$result[".$key."] = \$value;".$result[$key]." = ".$value;
}
if(!isset($result[$ID]))
{$result[$ID] = 1;
echo "\$result[".$ID."]:".$result[$ID];}
else
$result[$key]++;
rsort($result,SORT_NUMERIC);
$resultStr = '';
foreach($result as $key=>$value)
{$resultStr .= "$key|$value\r\n";
echo "\$resultStr:".$resultStr;}
//file_put_contents('count3.txt', $resutlStr);
$fp=fopen("count3.txt","w");
flock($fp,LOCK_EX);
fwrite($fp,$resultStr);
flock($fp,LOCK_UN);
fclose($fp);
}
?>
回复
chinaworker 2004-04-11
array_multisort
(PHP 4 )

array_multisort -- 对多个数组或多维数组进行排序
说明
bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]])


array_multisort() 可以用来一次对多个数组进行排序或者根据某一维对多维数组进行排序。排序时保留原有的键名关联。

输入数组被当成一个表的列并以行来排序 - 这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。

本函数的参数结构有些不同寻常,但是非常灵活。第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。

排序顺序标志:


SORT_ASC - 按照上升顺序排序

SORT_DESC - 按照下降顺序排序


排序类型标志:


SORT_REGULAR - 将项目按照通常方法比较

SORT_NUMERIC - 将项目按照数值比较

SORT_STRING - 将项目按照字符串比较


每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。

如果成功则返回 TRUE,失败则返回 FALSE。

例子 1. 对多个数组排序

$ar1 = array ("10", 100, 100, "a");
$ar2 = array (1, 3, "2", 1);
array_multisort ($ar1, $ar2);




本例中经过排序后,第一个数组将包含 10,"a",100,100。第二个数组将包含 1,1,"2",3。第二个数组中的项目顺序完全和第一个数组中相应的项目(100 和 100)顺序一致。

例子 2. 对多维数组排序

$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);




本例中经过排序后,第一个数组将包含 10,100,100,"a"(作为字符串上升排序),第二个数组将包含 1,3,"2",1(作为数值下降排序)。

【译者注】本函数相当有用,为有助于理解,请看下面这个例子:

例子 3. 名次排列

$grade = array("score" => array(70, 95, 70.0, 60, "70"),
"name" => array("Zhang San", "Li Si", "Wang Wu",
"Zhao Liu", "Liu Qi"));
array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC,
// 将分数作为数值,由高到低排序
$grade["name"], SORT_STRING, SORT_ASC);
// 将名字作为字符串,由小到大排序
var_dump($grade);


上例输出结果如下: array(2) {
["score"]=>
array(5) {
[0]=>
int(95)
[1]=>
string(2) "70"
[2]=>
float(70)
[3]=>
int(70)
[4]=>
int(60)
}
["name"]=>
array(5) {
[0]=>
string(5) "Li Si"
[1]=>
string(6) "Liu Qi"
[2]=>
string(7) "Wang Wu"
[3]=>
string(9) "Zhang San"
[4]=>
string(8) "Zhao Liu"
}
}

本例中对包含成绩的数组 $grade 按照分数(score)由高到低进行排序,分数相同的人则按照名字(name)由小到大排序。排序后李四 95 分为第一名,赵六 60 分为第五名没有异议。张三、王五和刘七都是 70 分,他们的名次则由其姓名的字母顺序排列,Liu 在前,Wang 在后而 Zhang 在最后。为了区别,三个 70 分分别用了整数,浮点数和字符串来表示,可以在程序输出中清楚地看到它们排序的结果。


回复
hahawen 2004-04-11
哦,上面的函数有的是php5的,呵呵,改一下
function addcountid($ID){
$result = array();
if(file_exists("count3.txt")){
$arr=file("count3.txt");
foreach($arr as $str){
list($key, $value) = explode('|', $str);
$result[trim($key)] = trim($value);
}
print_r($result);
$result["$ID"]++;
$resultStr = '';
print_r($result);
foreach($result as $key=>$value){
if($result["$ID"]>=$value)
$resultStr .= "$ID|".$result["$ID"]."\r\n";
if($key!=$ID)
$resultStr .= "$key|$value\r\n";
}
}else{
if($resultStr=='') $resultStr .= "$ID|1";
}

$fp = fopen("count3.txt",'w');
fputs($fp, $resultStr);
fclose($fp);
}
回复
发动态
发帖子
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
社区公告
暂无公告