我对PHP关联数组的序列化感到有些困惑

时间:2008-10-29 17:53:06

标签: php arrays serialization

a:3:{i:0;i:4;i:1;i:3;i:2;i:2;}

我是否正确地说这是一个大小为3的数组,其中键值对是0->41->32->2

如果是这样,我发现这种表现非常混乱。起初,我认为这是一个值列表(或包含{0, 4, 1, 3, 2, 2}的数组),但我认为a:3:是数组的大小。如果3是大小,那么键和值都会出现在括号中,无法清楚地标识键/值对而无需计算。

澄清我来自哪里:

为什么PHP开发人员选择以这种方式序列化?这有什么好处,让我们说var_dump和/或var_export显示其数据的方式?

4 个答案:

答案 0 :(得分:5)

是的array(4, 3, 2)

a表示数组,i表示整数作为键然后是值。你必须要计算到一个特定的,但PHP总是反序列化整个批次,所以无论如何它都有一个计数。

编辑:当你习惯它时,它不会太混乱,但它可能有点啰嗦,例如, JSON

  

注意:var_export()无法处理   循环引用   几乎不可能产生   可解析的PHP代码。如果你   想要充分发挥作用   表示数组或对象,   使用serialize()。

答案 1 :(得分:3)

$string="a:3:{i:0;i:4;i:1;i:3;i:2;i:2;}";
$array=unserialize($string);
print_r($array);

outpts:

Array
(
    [0] => 4
    [1] => 3
    [2] => 2
)

如果认为重点是PHP不区分整数索引数组和字符串索引哈希表。序列化格式可以完全相同的方式用于哈希表:a:<<size>>:{<<keytype>>:<<key>>;<<valuetype>>:<<value>>;...}

由于格式不是人类可读的,而是提供表示所有PHP变量类型(资源除外)的通用格式,我认为使用给定格式更简单,因为可以重建基础变量通过逐字符读取字符串。

答案 2 :(得分:1)

序列化的PHP数据实际上并不是人类可读的 - 据我所知,这不是格式的目标。

我认为格式看起来像它的方式的最大原因是为了简洁,它的形式也可能具有与其处理速度相关的基础。

答案 3 :(得分:0)

为什么不使用unserialize()函数将数据恢复到之前的状态?