场景 :
cookie无法存储复合形式的数据,所以需要序列化一个多维数组存入cookie,但是由于php版本太低(5.2),不支持json_encode
解决:
1,serialize和unserialize函数 : 只支持一维数组 ,据说对对象的支持比较好,json_encode是不支持对象的
2,base64_encode和base64_decode,同样的问题,不支持多维,如果用它的话,base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用:
function my_serialize( $obj )
{
return base64_encode(gzcompress(serialize($obj)));
}
//反序列化
function my_unserialize($txt)
{
return unserialize(gzuncompress(base64_decode($txt)));
}
3. var_export 和 eval
$look_books = array($aid => array($cid => array('article_name' => $article->articlename, 'chapter_name' => $chapter->chaptername))) + $look_books;
$look_books = var_export($look_books, true);
setcookie('look_books', $look_books, $cookieTime, '/', '.dym.com');
支持多维数组,但是需要注意单双引号会有转义符,导致eval失败,需要把转义符去掉
stripcslashes() 即可。
4. wddx_serialize_value 和 wddx deserialize
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');
//序列化数组
$s = wddx_serialize_value($a);
echo $s;
//输出结果(查看输出字符串的源码):<wddxPacket version='1.0'><header/><data><struct><var name='a'><string>Apple</string></var><var name='b'><string>banana</string></var><var name='c'><string>Coconut</string></var></struct></data></wddxPacket>
echo '<br /><br />';
//反序列化
$o = wddx_deserialize($s);
print_r($o);
//输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut )
这种方式xml本身的标签占用字符过多,比较占用内存。
解决时自己使用了第三种。