配列を利用したクッキー
Home >> PHP実践リファレンス >> クッキー処理 >> 配列を利用したクッキー

配列を利用したクッキー

クッキーに配列利用

1台のサーバが同一PCに発行できるクッキー数には制限があります。共有サーバなどを使用している場合には特に注意が必要ですが、クッキーの制限数はサーバに対して割り当てられているので、同じサーバを使用している人と共通のものになってしまいます。

1台のサーバPCが1台のクライアントPCに発行できるクッキー数は最大で20個ですが、そう考えるとひとりで20個使い切るわけにもいきません。そういう時に便利なのがクッキー値に配列を利用する方法です。

クッキーの数は1つの変数が1つのクッキーとして数えられます。つまり、配列を使用する事によって変数1つで色々な値を格納できるので、クッキーの制限数をあまり気にしなくて済むようになります。さらに、配列として1つの変数にまとめておく事でクッキー名をいろいろ考えなくて済みますし、1つの変数でまとまった値が管理できるというのは非常に便利です。

クッキーの保存と値の取り出し

配列を利用したクッキーは以下のように書く事ですぐできます。掲示板やメール送信フォームなどには本文以外に名前・E-mail・URLなどの入力項目がありますが今回はその3つを配列を使用したクッキーに格納します。ここでは有効期限は省略しますので適宜付け足して下さい。

<?php
$name
= 'そふぃ'; // 名前
$mail = 'aaa@bbb.com'; // E-mail
$url  = 'http://nyx.pu1.net/'; // URL

setcookie('my_cookie[0]', $name);
setcookie('my_cookie[1]', $mail);
setcookie('my_cookie[2]', $url);
?>

注意したいのは配列のキーをちゃんと指定しないと・・・・・どんどん上書きされてくだけというところだけです。つまり、キーを空にしてsetcookie()を実行すると、配列のキーは、0→1→2・・・とはいかず、0→0→0と上書きになります。つまり、この例だと最後のURL値だけしか残らなくなってしまいます。このような指定方法を取る場合はキーをちゃんと指定しましょう。

クッキー値を取り出したい場合はループを使うと楽です。ここではforeach文を使用してます。foreachに指定した配列が存在しないとエラーになってしまうので、最初にisset()関数で配列の存在をチェックし、存在した場合のみ処理するようにしてます。

<?php
// isset()関数でクッキー値があるかどうかチェック
if( isset($_COOKIE['my_cookie']) ){
  foreach(
$_COOKIE['my_cookie'] as $name => $val){
    echo
$name." => ".$val."<br />\n";
  }
}
?>

出力結果

出力結果が表示されていなければ更新ボタンを押してみて下さい。

書式

  • bool isset( mixed var )

参考関数

  • isset() ---- 変数がセットされているどうか調べる

応用処理

さて、上記の例ではsetcookie()関数を3回実行してるので、書くのも面倒だし効率も悪そうです。これを解消できる便利な関数を紹介します。クッキーがメインですのであんまり細かくはやりません。

まず、クッキーに保存したい全ての値をタブ\tで区切った1つの文字列にしてしまいます。こうすればクッキーの数も1つで済みますし、取り出す時にはタブ\tを削除すればどうにかなりそうな気がしますね。

イメージとしてはこんなカンジです。

そふぃ(タブ)aaa@bbb.com(タブ)http://nyx.pu1.net/

ここでは区切り文字にタブ\tを使用してますが、カンマ,で区切ろうが半角スペースあたりで区切ろうが別に何でもいいです。但し、区切り文字にはクッキー値に出てこないであろう値を指定しないといけません。例えば今回のスクリプトではURLがあるので、区切り文字に/あたりを使うと変なところで区切られてしまいます。その点だけ注意して区切り文字を決めて下さい。

ここではimplode()という関数を使用しますが、implode()は配列の要素を、指定した文字列(結合文字)で結合してくれるという関数です。今回の結合文字はタブ\tです。つまり、クッキーの値が配列に格納されてればimplode()関数ですぐにタブ区切りの文字列が出来上がります。

書式

  • string implode( string glue, array pieces )

参考関数

  • implode() ---- 配列の要素を文字列により連結する

そんな訳で、スクリプトは

  1. クッキーの値を配列に格納
  2. implode()で結合

のような手順になります。

<?php
$name
= 'そふぃ'; // 名前
$mail = 'aaa@bbb.com'; // E-mail
$url  = 'http://nyx.pu1.net/'; // URL

// 値を配列に格納
$cookie_array = array($name, $mail, $url);

// 配列をタブ区切りの文字列に変換
$cookie = implode("\t", $cookie_array);

setcookie('my_cookie2', $cookie);
?>

さてこのようにしてクッキー値をタブ区切りの文字列にした場合は、タブ\tを削除して元の配列に戻してもらえるとありがたいのですが、そういった関数もちゃんと用意されています。explode()という関数です。

explode()を使用すると、指定した区切り文字で文字列を分割してくれます。分割した文字列は配列となります。今回は区切り文字にタブ\tを使用しましたのでタブ\tで分割する事になります。

これで1つのクッキー値が配列の1要素として格納される事になるので、値を簡単に取り出せるようになります。今回はforeach文を使用して全て取り出してます。

書式

  • array explode( string separator, string string [, int limit ] )

参考関数

  • explode() ---- 文字列を文字列により分割する
<?php
if( isset($_COOKIE['my_cookie2']) ){
  
$cookie_val = explode("\t", $_COOKIE['my_cookie2']);
  foreach(
$cookie_val as $value){
    echo
$value."<br />\n";
  }
}
?>

出力結果