データベースに配列データをそのまま保存したい時などに使います。
通常、データベースには「フィールド:値」という形式で保存される為、配列データをそのまま保存することはできません。
仮に「array(‘a’, ‘b’, ‘c’)」という値を保存したとしても、それはただの 文字列 にすぎません。
一方、シリアライズすると、配列データを配列データとして保存することができます。
特に、配列の要素数や構造が動的に変化するデータを取り扱う場合には、必ずと言っていいほど使うでしょう。
では、シリアライズによって、データがどのように変換されるかを見ていきます。
まずはPHPのシリアライズから。
PHP – serialize() シリアライズ
シリアライズ後の文字列は「型:値」の形式に変換されます。
<?php echo serialize(100); ?> 結果: i:100;
整数型(integer)は「i」です。
<?php echo serialize("hijiri"); ?> 結果: s:6:"hijiri";
文字列型(string)は「s」です。
その後に付いている「6」という数字はバイト数です。
<?php echo serialize(true); ?> 結果: b:1;
論理型(boolean)は「b」です。
true:1, false:0
<?php echo serialize(null); ?> 結果: N;
ヌル型(null)は「N」です。
<?php echo serialize(array(1,2,3)); ?> 結果: a:3:{i:0;i:1;i:1;i:2;i:2;i:3;} <?php echo serialize(array("a","b")); ?> 結果: a:2:{i:0;s:1:"a";i:1;s:1:"b";} <?php echo serialize(array("a"=>123, "b"=>456)); ?> 結果: a:2:{s:1:"a";i:123;s:1:"b";i:456;} ?>
配列型(array)は「a」です。
その後に要素数が付きます。「a:要素数:{}」
{}内には、配列の要素のキーと値が、それぞれシリアライズ変換されて並びます。「キー;値;」
もうシリアライズ変換された文字列は読めますよね?
PHP – unserialize() デシリアライズ
シリアライズで変換された文字列を、元のデータに戻してみます。
<?php print_r(unserialize('a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}')); ?> 結果: Array ( [0] => 1 [1] => 2 [2] => 3 ) <?php print_r(unserialize('a:2:{i:0;s:1:"a";i:1;s:1:"b";}')); ?> 結果: Array ( [0] => a [1] => b ) <?php print_r(unserialize('a:2:{s:1:"a";i:123;s:1:"b";i:456;}')) ?> 結果: Array ( [a] => 123 [b] => 456 )
実際には以下のような流れになるので、シリアライズ変換された文字列を意識することはありません。
$arr = serialize($arr); // データ保存 // データ読み込み $arr = unserialize(データ);
※シリアライズデータを取り扱う場合は、適切なエスケープ処理もお忘れなく。
jQueryAPI serialize()
シリアライズは javascript でも使えます。
jQueryでは標準でシリアライズ関数が用意されています。
以下の例では、サブミットするとフォームの内容が、すべてシリアライズ文字列として返されます。
<form> <dl> <dt>name:</dt> <dd><input type="text" name="name" /></dd> <dt>email:</dt> <dd><input type="text" name="email" /></dd> <dt>message:</dt> <dd><textarea name="message"></textarea></dd> </dl> <input type="submit" value="submit" /> </form>
$(function() { $(":submit").click(function() { alert($("form").serialize()); }); });
結果: name=&email=&message=
おまけ – WordPressの例
WordPressデータベースの wp_options テーブルには、アクティブなプラグインの設定値や、アクティブなテーマの設定値が保存されています。これらの値はすべてシリアライズされています。
また、多くのWordPressのプラグインは、wp_options テーブルに、固有の設定値を保存する機構になっており、設定値を保存する関数 update_option() を使うと、自動的にシリアライズして保存されるようになっています。
Comments
[…] 覚えておきたい「シリアライズ – serialize」 | hijiriworld web: […]