大多数时候,PHP开发人员需要在文件或数据库中存储一个复杂的数组。复杂的数组是那些具有多个单一数据类型或数组元素的数组。
在本教程中,我们将向您展示如何使用 serialize() 和 unserialize() 函数来实现存储和读取复杂数据。
serialize()是PHP内置函数,用于序列化指定定数组。serialize()函数接受一个参数,该参数是我们要序列化的数据,并返回一个序列化的字符串.
语法
serialize(value)
其中 $value 就是要序列化的变量。
serialize() 函数可以处理除了 resource(资源)之外的任何类型。当序列化对象时,PHP 会在序列动作之前调用该对象的 __sleep() 成员函数。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 反序列化对象时,将调用 __wakeup() 成员函数。
例子:
<?php // say you have an array something like this $multidimentional_array= array( array( array("rose", 1.25, 15), array("daisy", 0.75, 25), array("orchid", 4, 7) ), array( array("rose", 1.25, 15), array("daisy", 0.75, 25), array("orchid", 5, 7) ), array( array("rose", 1.25, 15), array("daisy", 0.75, 25), array("orchid", 8, 7) ) ); // serialize $serialized_array=serialize($multidimentional_array); print_r($serialized_array); ?>
输出:
a:3:{i:0;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:4;i:2;i:7;}}i:1;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:5;i:2;i:7;}}i:2;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:8;i:2;i:7;}}}
序列化文本如上所示。现在,该文本可以存储在数据库中,并且当我们需要在前端显示数据时,我们可以对数据进行反序列化并恢复为原始格式。
unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。
当使用 serialize() 函数将对象序列化后,可以将这个得到的字符串保存到文件或者数据库中,然后在需要的地方使用 unserialize() 函数将这个字符串反序列化,unserialize() 函数的语法格式如下:
unserialize(string $str)
其中,$str 为使用 serialize() 函数序列化后的字符串。如果传入的字符串不可被反序列化,则会返回 FALSE,并产生一个 E_NOTICE。
例子:
<?php $serialized_data = serialize(array('Math', 'Language', 'Science')); echo $serialized_data . '<br>'; // Unserialize the data $var1 = unserialize($serialized_data); // Show the unserialized data; var_dump ($var1); ?>
输出:
a:3:{i:0;s:4:"Math";i:1;s:8:"Language";i:2;s:7:"Science";} array(3) { [0]=> string(4) "Math" [1]=> string(8) "Language" [2]=> string(7) "Science" }
现在,让我们来看看 serialize() 和 unserialize() 两者如何在实践中被使用:
<?php $myvar = ['hello', 42, [1, 'two'], 'apple']; // Serialize the above data $string = serialize($myvar); // Unserialize the data in $string $newvar = unserialize($string); // Print the unserialized data print_r($newvar); ?>
该示例的输出如下:
Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple )
当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
// to safely serialize $save_in_db = base64_encode(serialize($value)); // to unserialize value fetched from db... $value = unserialize(base64_decode($fetched_from_db));
但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。
//定义一个用来序列化对象的函数 function my_serialize( $obj ) { return base64_encode(gzcompress(serialize($obj))); } //反序列化 function my_unserialize($txt) { return unserialize(gzuncompress(base64_decode($txt))); }
以上就是本文的全部内容,希望对大家的学习有所帮助。更多教程请访问码农之家