如何使用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耦合起来

相反,
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

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

是的,我可以。假设我们需要跟踪您的系统意味着在您的系统中有多个管理员和子管理员,所有这些都可以插入、更新或编辑任何信息。稍后您需要知道是谁进行了此更改。为了解决这个问题,您需要序列化

  **Explain:**Create a table named history which stores all changes. Each time there is a change insert a new row in this table. It might have this fields:

  history(id,target_table(name of the table), target_id (ID of the saved entry),create/edit/change data (serialized data of the saved row),date)
我希望这将对您有所帮助。

PHP serialize()unserialize()用法

echo '<pre>';
// 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);
同样,如果要恢复原始数组,只需使用PHP unserialize()函数

<?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";}

这里
a=数组的大小
i=阵列数的计数
s=数组值的大小


您可以使用serialize在数据库中存储数据数组
并可以检索和取消序列化要使用的数据。

基本上,当您序列化数组或对象时,只需将其转换为有效的字符串格式,以便轻松地将其存储在php脚本之外

  • 使用serialize在数据库中保存对象的状态(以用户类为例),然后取消序列化数据,将上一个状态加载回对象(方法不是序列化程序,您需要包含对象类才能使用它)
    • 用户个性化
  • 注意:对于对象,您应该使用神奇的睡眠和唤醒方法。 __sleep由serialize()调用。sleep方法将从要持久化的对象返回一个值数组

    __唤醒由unserialize()调用。唤醒方法应获取未序列化的值,并在对象中对其进行初始化


    要在php和js之间传递数据,可以使用json_encode将php数组转换为有效的json格式。或者反过来—使用JSON.parese()将输出数据(字符串)转换为有效的JSON对象。您可能希望这样做以利用本地存储。(离线数据访问)

    请!请请不要序列化数据并将其放入数据库中。Serialize可以这样使用,但它缺少关系数据库和数据库引擎中固有的数据类型的要点。这样做会使数据库中的数据不可移植,难以读取,并且会使查询复杂化。如果你希望你的应用程序能够移植到其他语言,比如说你发现你的应用程序的某些部分使用Java是有意义的,那么序列化将成为一个麻烦。您应该始终能够查询和修改数据库中的数据,而无需使用第三方中介工具来操作要插入的数据

    这使得维护代码非常困难,使用po进行代码维护
    $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, '"');