无法让统计数据收集起作用

时间:2014-03-14 21:33:38

标签: php

使用PHP从多个文件中收集统计信息。目标是获取整个第一行数据,即列名,然后从第一列与代码中指定的名称匹配的行中获取整行数据。然后,这两行应相互链接,以便它们可以显示在动态图像中。

但是,为了避免来自外部数据源的过多请求,通过将数据保存到json文件中,每天只下载一次数据。还保留了前一天的数据,以执行差异计算。

我坚持的是......好吧,它没有按预期工作。动态图像不会显示,并且表示无法显示,因为它包含错误,并且文件未正确创建。没有任何文件存在,只有“旧”文件。正在创建数据文件,收集的数据以我不期望的格式保存在那里。

这是整个PHP代码:

<?php
    header("Content-Type:image/png");
    $root=realpath($_SERVER['DOCUMENT_ROOT']);
    function saveTeamData(){
        $urls=array('http://www.dc-vault.com/stats/bio.txt','http://www.dc-vault.com/stats/math.txt','http://www.dc-vault.com/stats/misc.txt','http://www.dc-vault.com/stats/overall.txt','http://www.dc-vault.com/stats/phys.txt');
        $fullJson=array();
        function stats($url){
            $json=array();
            $team=array("teamName");
            $file=fopen($url,'r');
            $firstRow=fgetcsv($file,0,"\t");
            while($data=fgetcsv($file,0,"\t")){
                if(in_array($data[0],$team)){
                    foreach($firstRow as $indx=>$colName){

                        if((strpos($colName,'Position')!=0)||(strpos($colName,'Score')!=0)||(strpos($colName,'Team')!=0)){
                            if(strrpos($colName,'Position')!==false){
                                $colName=substr($colName,0,strpos($colName,' Position'));
                                $colName=$colName."Pos";
                            }else{
                                $colName=substr($colName,0,strpos($colName,' Score'));
                                $colName=$colName."Score";
                            }
                            $colName=str_replace(' ',',',$colName);
                            $teamData[$colName]=$data[$indx];
                        }
                    }
                    $json=$teamData;
                }
            }
            fclose($file);
            return $json;
        }
        foreach($urls as $item){
            $fullJson=array_merge($fullJson,stats($item));
        }
        $final_json['teamName']=$fullJson;
        $final_json['date']=date("Y-m-d G:i:s",strtotime("11:00"));
        $final_json=json_encode($final_json);
        file_put_contents("$root/scripts/vaultData.js",$final_json);
        return $final_json;
    }
    if(!file_exists("$root/scripts/vaultData.js")){
        $teamData=saveTeamData();
    }else{
        $teamData=json_decode(file_get_contents("$root/scripts/vaultData.js"));
    }
    $lastDate=$teamData->date;
    $now=date("Y-m-d G:i:s");
    $hours=(strtotime($now)-strtotime($lastDate))/3600;
    if($hours>=24||!file_exists("$root/scripts/vaultDataOld.js")){
        file_put_contents("$root/scripts/vaultDataOld.js",json_encode($teamData));
        $teamData=saveTeamData();
    }
    $team=$teamData->{"teamName"};
    $teamOld=json_decode(file_get_contents("$root/scripts/vaultDataOld.js"))->{"teamName"};
    $template=imagecreatefrompng("$root/images/vaultInfo.png");
    $black=imagecolorallocate($template,0,0,0);
    $font='images/fonts/UbuntuMono-R.ttf';
    $projects=array();
    $subsections=array();
    foreach($team as $key=>$val){
        $projectName=preg_match("/^(.*)(?:Pos|Score)$/",$key,$cap);
        $projectName=str_replace(","," ",$cap[1]);
        if(preg_match("/Pos/",$key)){
            $$key=(strlen($val)>10?substr($val,0,10):$val);
            $delta=$key."Delta";
            $$delta=($val - $teamOld->{$key});
            $$delta=(strlen($$delta)>5?substr($$delta,0,5):$$delta);
            if($projectName!=="Overall"){
                if(!in_array($projectName,array("Physical Science","Bio/Med Science","Mathematics","Miscellaneous"))){
                    $projects[$projectName]["position"]=$$key;
                    $projects[$projectName]["position delta"]=$$delta*1;
                }else{
                    $subsections[$projectName]["position"]=$$key;
                    $subsections[$projectName]["position delta"]=$$delta*1;
                }
            }
        }elseif(preg_match("/Score/",$key)){
            $$key=(strlen($val)>10?substr($val,0,10):$val);
            $delta=$key."Delta";
            $$delta=($val - $teamOld->{$key});
            $$delta=(strlen($$delta)>9?substr($$delta,0,9):$$delta);
            if($projectName!=="Overall"){
                if(!in_array($projectName,array("Physical Science","Bio/Med Science","Mathematics","Miscellaneous"))){
                    $projects[$projectName]["score"]=$$key;
                    $projects[$projectName]["score delta"]=$$delta;
                }else{
                    $subsections[$projectName]["score"]=$$key;
                    $subsections[$projectName]["score delta"]=$$delta;
                }
            }
        }
    }
    $sort=array();
    foreach($projects as $key=>$row){
        $sort[$key]=$row["score"];
    }
    array_multisort($sort,SORT_DESC,$projects);
    $lastupdated=round($hours,2).' hours ago';
    $y=35;
    foreach($projects as $name=>$project){
        imagettftext($template,10,0,5,$y,$black,$font,$name);
        imagettftext($template,10,0,149,$y,$black,$font,$project['position']);
        imagettftext($template,10,0,216,$y,$black,$font,$project['position delta']*-1);
        imagettftext($template,10,0,257,$y,$black,$font,$project['score']);
        imagettftext($template,10,0,331,$y,$black,$font,$project['score delta']);
        $y+=20;
    }
    $y=655;
    foreach($subsections as $name=>$subsection){
        imagettftext($template,10,0,5,$y,$black,$font,$name);
        imagettftext($template,10,0,149,$y,$black,$font,$subsection['position']);
        imagettftext($template,10,0,216,$y,$black,$font,$subsection['position delta']*-1);
        imagettftext($template,10,0,257,$y,$black,$font,$subsection['score']);
        imagettftext($template,10,0,331,$y,$black,$font,$subsection['score delta']);
        $y+=20;
    }
    imagettftext($template,10,0,149,735,$black,$font,$team->{'OverallPos'});
    imagettftext($template,10,0,216,735,$black,$font,$OverallPosDelta*-1);
    imagettftext($template,10,0,257,735,$black,$font,$OverallScore);
    imagettftext($template,10,0,331,735,$black,$font,$OverallScoreDelta);
    imagettftext($template,10,0,149,755,$black,$font,$lastupdated);
    imagepng($template);
?>

以下是保存数据时的样子:

"{\"teamName\":{\"Folding@HomePos\":\"51\",\"Folding@HomeScore\":\"9994.405407\"},\"date\":\"2014-03-14 11:00:00\"}"

我省略了大部分数据,因为它只会让事情过长,而且有助于查看格式。现在它出乎意料的输出的原因是因为我没有预期会有斜杠。此代码的旧版本将输出如下:

{"teamName":{"Asteroids@HomePos":"192","Asteroids@HomeScore":"7647.783251"},"date":"2014-03-14 11:00:00"}

因此,预期的行为是从每个制表符分隔的文本文件中的上述行中收集数据,将旧数据复制到“旧”数据中。数据文件(vaultDataold),将新数据保存到&#39;当前&#39;数据文件(vaultData),然后显示来自&#39;当前&#39;在动态图片中存档,同时执行“新”文件。减去&#39; old&#39;计算两个文件以显示自前一天以来的变化。

这些代码大部分都应该有效,因为我之前以不同的方式使用它。这个问题可能存在于收集行数据并保存它的地方,很可能是后者。我猜这些斜线导致了这个问题。

1 个答案:

答案 0 :(得分:0)

事实证明原因是双重的。首先,在我的函数中,我是JSON编码已经编码的东西,所以当第二个文件被保存时,它出现在我的问题中。为了解决这个问题,我做了这个:

$final_json['date']=date("Y-m-d G:i:s",strtotime("11:00"));
$encode_json=json_encode($final_json);
file_put_contents("$root/scripts/vaultData.js",$encode_json);
return $final_json;

另外,正如评论中的另一个人所指出的,我必须在我的函数中添加$ root,并在其中再次添加。