配列を利用したクッキー
そふぃのPHP入門 >> PHP実践リファレンス >> クッキー処理 >> 配列を利用したクッキー

配列を利用したクッキー

クッキーに配列利用

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

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

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

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

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

  1. <?php
  2. $name = 'そふぃ'; // 名前
  3. $mail = 'aaa@bbb.com'; // E-mail
  4. $url = 'http://nyx.pu1.net/'; // URL
  5.  
  6. setcookie('my_cookie[0]', $name);
  7. setcookie('my_cookie[1]', $mail);
  8. setcookie('my_cookie[2]', $url);
  9. ?>

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

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

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

出力結果

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

参考関数

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

書式

  • bool isset( mixed var )

応用処理

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

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

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

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

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

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

参考関数

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

書式

  • string implode( string glue , array pieces )

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

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

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

implode()関数を用いたクッキー値の結合

  1. <?php
  2. $name = 'そふぃ'; // 名前
  3. $mail = 'aaa@bbb.com'; // E-mail
  4. $url = 'http://nyx.pu1.net/'; // URL
  5.  
  6. // 値を配列に格納
  7. $cookie_array = array($name, $mail, $url);
  8.  
  9. // 配列をタブ区切りの文字列に変換
  10. $cookie = implode("\t", $cookie_array);
  11.  
  12. setcookie('my_cookie2', $cookie);
  13. ?>

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

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

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

参考関数

  • explode() ---- 文字列を文字列により分割する

書式

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

explode()関数を用いてクッキー値を分割

  1. <?php
  2. if( isset($_COOKIE['my_cookie2']) ){
  3.   $cookie_val = explode("\t", $_COOKIE['my_cookie2']);
  4.   foreach($cookie_val as $value){
  5.     echo $value."<br />\n";
  6.   }
  7. }
  8. ?>

出力結果