記事のクリップをcookieで操作


ものすごく泥臭いですが、素のPHPだけでつくったもの。
jsとかjQuery がうまいこと動かなかったのでやっつけで処理しました。

なんか色々無駄なことをしている自覚はあるけど、どこをどうしたらスマートになるのかわかりません…。
ほんとは2~3行で終わる処理のような気がしますorz
とりあえず動くことを優先させたので、headerの戻り先さえ変えればcookie使える環境ならどこでも動く…はず。

仕様

  • 上限は10
  • 上限を超えると古いものから消えていく
  • 有効期限は最後の操作から30日後
  • 解除すると空いた部分は繰り上がる
  • GETで登録/解除の切り替え
clip.php
$ST  = filter_input(INPUT_GET, "st");  //登録or解除
$pid = filter_input(INPUT_GET, "pid"); //記事ID

if ($ST == 1) {

    # cookieに書き込み
    if (!is_array($_COOKIE['clip'])) {
        setcookie("clip[0]", $pid, time()+60*60*24*30);
    } else {
        $cnt = count($_COOKIE['clip']);
        if (!in_array($pid, $_COOKIE['clip'])) {
            if ($cnt >= 10) {//上限はここで調整
                $arr = $_COOKIE['clip'];
                unset($_COOKIE['clip']);
                array_shift($arr);
                $arr[] = $pid;
                foreach ($arr as $key => $value) {
                    setcookie("clip[$key]", $value, time()+60*60*24*30);
                }
            } else {
                setcookie("clip[$cnt]", $pid, time()+60*60*24*30);
            }
        }
    }
    header("Location: ./detail.php?pid=".$pid);

} elseif ($ST == 9) {

    # 指定のcookieを削除
    $clip = array();
    $arr  = $_COOKIE['clip'];
    unset($_COOKIE['clip']);
    foreach ($arr as $key => $value) {
    setcookie("clip[$key]", '');
        if ($value == $pid) {
            unset($value);
        } else {
            $clip[] = $value;
        }
    }
    foreach ($clip as $key => $value) {
        setcookie("clip[$key]", $value, time()+60*60*24*30);
    }
    header("Location: ./detail.php?pid=".$pid);

} else {

    foreach ($_COOKIE['clip'] as $key => $value) {
        setcookie("clip[$key]", '');
    }
    header("Location: ./top.php");

}