カウントデータのフォーマット(explode)

メモ:  Category:php

収集するデータを、「今日、昨日、今月、先月、総計をカウントする」という仕様でした。

そこで、ファイル内のフォーマットを「最終登録日(年,月,日),総計カウント数,今日のカウント数,昨日のカウント数,今月のカウント数,先月のカウント数」といった形で各値をカンマで区切ります。

最終登録日は、日付が変わったかどうかを確認するために使用します。

<?php
$fp = @fopen($this->count_file,"r+");

$rec = fgets($fp);
$rec = rtrim($rec);

if (strlen($rec) > 0) {
    //カウント値あり
    $countinfo = explode(",", $rec);
    list($year,$month,$day,$total, $today, $yesterday, $thismonth, $lastmonth) = $countinfo;
} else {
    $date = localtime(time(),1);
    $year = $date[tm_year];
    $month = $date[tm_mon];
    $day = $date[tm_mday];
    $total = $today = $yesterday = $thismonth = $lastmonth  = 0;
}
$date = localtime(time(),1);
if($day != $date[tm_mday]){
    //日付が変わったら
    $yesterday = $today;
    $today = 0;
    if($month != $date[tm_mon]){
        $lastmonth = $thismonth;
        $thismonth = 0;
    }
}
//カウントアップ
$total++;
$today++;
$thismonth++;

ftruncate($fp,0);
rewind($fp);
fputs($fp, "$year,$month,$day,$total,$today,$yesterday,$thismonth,$lastmonth\n");

fclose($fp);
?>

まず最初に、上記ソースでは問題になる点があります。

上記例では、毎日かならずひとりは訪問しないと昨日という処理や先月という処理がおかしくなります。

この件に関しては、別途考えたいと思います。

ファイルをopenしfgets関数でデータを取得すると文字列としてデータが取得されます。この文字列をカンマで分解するのが explode() 関数です。

explode() 関数は、文字列を文字列により分割する関数で分割された文字列の配列を返します。

第一引数は分割する基準の文字列になります。第二引数が分割対象文字列です。

カウントアップした結果をファイルに書き込むには、fputsを使用しています。

phpの良い所でもあり曖昧な所でもある文字列の書き方です。ダブルコーテーションで囲まれた部分の変数は有効になります。ただし、変数名と文字列の区別がつきにくい場合は変数名として扱われません。

bluenote by BBB