如何使用php serialize()和unserialize()

如何使用php serialize()和unserialize(),php,Php,我的问题很基本 我没有找到任何例子来满足我的需求,比如php中的serialize()和unserialize()到底是什么意思?他们只是给出了一个例子——序列化一个数组并以无法解释的格式显示输出。通过他们的行话很难理解基本概念 编辑: <?php $a= array( '1' => 'elem 1', '2'=> 'elem 2', '3'=>' elem 3'); print_r($a); echo ("<br></br>"); $b=ser

我的问题很基本

我没有找到任何例子来满足我的需求,比如php中的
serialize()
unserialize()
到底是什么意思?他们只是给出了一个例子——序列化一个数组并以无法解释的格式显示输出。通过他们的行话很难理解基本概念

编辑:

<?php

$a= array( '1' => 'elem 1', '2'=> 'elem 2', '3'=>' elem 3');
print_r($a);
echo ("<br></br>");
$b=serialize($a);
print_r($b);

?>

我无法理解第二个输出。除此之外,有人能举一个例子说明我在使用php数组之前需要序列化它吗?

当你想让你的php值可存储时,你必须把它变成一个字符串值,这就是为什么。反之亦然。

当您想要使php值可存储时,必须将其转换为字符串值,这就是它的作用。并做相反的事情。

来自:

生成值的可存储表示形式。 这对于在不丢失PHP值的类型和结构的情况下存储或传递PHP值非常有用

本质上,它接受一个php数组或对象,并将其转换为字符串(然后您可以根据需要传输或存储)

取消序列化用于将字符串转换回对象。

来自:

生成值的可存储表示形式。 这对于在不丢失PHP值的类型和结构的情况下存储或传递PHP值非常有用

本质上,它接受一个php数组或对象,并将其转换为字符串(然后您可以根据需要传输或存储)


取消序列化用于将字符串转换回对象。

大多数存储介质都可以存储字符串类型。它们不能直接存储诸如数组或对象之类的PHP数据结构,也不应该直接存储,因为这样会将数据存储介质与PHP耦合起来

相反,
serialize()
允许您将其中一个结构存储为字符串。可以使用
unserialize()
将其从字符串表示形式中反序列化


如果您熟悉
json\u encode()
json\u decode()
(以及一般的json),则概念类似。

大多数存储介质都可以存储字符串类型。它们不能直接存储诸如数组或对象之类的PHP数据结构,也不应该直接存储,因为这样会将数据存储介质与PHP耦合起来

相反,
serialize()
允许您将其中一个结构存储为字符串。可以使用
unserialize()
将其从字符串表示形式中反序列化


如果您熟悉
json\u encode()
json\u decode()
(以及一般的json),则概念类似。

PHP数组或对象或其他复杂数据结构不能在运行的PHP脚本之外传输、存储或以其他方式使用。如果您想将如此复杂的数据结构保持在脚本的一次运行之外,则需要对其进行序列化。这只是意味着将结构放入一个“较低的公分母”中,可以由PHP以外的东西处理,比如数据库、文本文件、套接字。标准的PHP函数
serialize
就是一种表达这种东西的格式,它将数据结构序列化为PHP特有的字符串表示形式,并且可以使用
unserialize
将其反转为PHP对象。不过还有很多其他格式,比如JSON或XML


以这一常见问题为例:

如何将PHP数组传递给Javascript?
PHP和Javascript只能通过字符串进行通信。您可以非常轻松地将字符串
“foo”
传递给Javascript。您可以非常轻松地将数字
1
传递给Javascript。您可以轻松地将布尔值
true
false
传递给Javascript。但是如何将这个数组传递给Javascript呢

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 
答案是序列化。对于PHP/Javascript,JSON实际上是更好的序列化格式:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }
Javascript可以轻松地将其转换为实际的Javascript数组

这对于相同数据结构的表示同样有效,但:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}
但几乎只有PHP使用它,其他地方几乎不支持这种格式。
这是非常常见的,并且得到了很好的支持:

<array>
    <element key='1'>elem 1</element>
    <element key='2'>elem 2</element>
    <element key='3'>elem 3</element>
</array>

要素1
要素2
要素3

在许多情况下,您需要将复杂的数据结构作为字符串传递。序列化将任意数据结构表示为字符串,解决了这一问题。

PHP数组或对象或其他复杂数据结构不能在运行的PHP脚本之外传输、存储或使用。如果您想将如此复杂的数据结构保持在脚本的一次运行之外,则需要对其进行序列化。这只是意味着将结构放入一个“较低的公分母”中,可以由PHP以外的东西处理,比如数据库、文本文件、套接字。标准的PHP函数
serialize
就是一种表达这种东西的格式,它将数据结构序列化为PHP特有的字符串表示形式,并且可以使用
unserialize
将其反转为PHP对象。不过还有很多其他格式,比如JSON或XML


以这一常见问题为例:

如何将PHP数组传递给Javascript?
PHP和Javascript只能通过字符串进行通信。您可以非常轻松地将字符串
“foo”
传递给Javascript。您可以非常轻松地将数字
1
传递给Javascript。您可以轻松地将布尔值
true
false
传递给Javascript。但是如何将这个数组传递给Javascript呢

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 
答案是序列化。对于PHP/Javascript,JSON实际上是更好的序列化格式:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }
Javascript可以轻松地将其转换为实际的Javascript数组

这对于相同数据结构的表示同样有效,但:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}
但几乎只有PHP使用它,对这种格式几乎没有支持
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;}}}
$original_array=unserialize($serialized_array);
var_export($original_array);
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);
a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}
$posts = base64_encode(serialize($_POST));
header("Location: $_SERVER[REQUEST_URI]?x=$posts");
if($_GET['x']) {
   // unpack serialize and encoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}
preg_match_all('/\".*?\"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');