我有一个名为$aFilter
的数组。在序列化它时,很少有数字被插入其中。我不明白为什么会这样?为什么要插入数字,以什么方式插入?有人能告诉我这个serialize()实际上做了什么,并以一种简单的方式生成了这样的输出吗?
下面是我的程序:
<!DOCTYPE html>
<html>
<body>
<?php
$aFilter = Array(
'pages' => 1,
'photo' => 1,
'link' => 1,
'event' => 1,
'friend' => 1,
'user_status' => 1,
'poll' => 1,
'quiz' => 1,
'market' => 1,
'apps' => 1
);
echo serialize($aFilter);
?>
</body>
</html>
以上程序输出如下:
a:10:{s:5:"pages";i:1;s:5:"photo";i:1;s:4:"link";i:1;s:5:"event";i:1;s:6:"friend";i:1;s:11:"user_status";i:1;s:4:"poll";i:1;s:4:"quiz";i:1;s:6:"market";i:1;s:4:"apps";i:1;}
请帮我把这件事弄明白。
谢谢。
让我们先了解serializing
的含义。
Serialize
,根据手册:
生成值
的可存储表示形式
所以我们基本上需要用字符串来描述任何值,这样我们以后也可以反序列化它。因此,我们将看到一个描述序列化值的模式,它通常包含type of value
, length
和value
。
a:10{s:5:"pages";i:1;s:5:"photo";i:1;s:4:"link";i:1;s:5:"event";i:1;s:6:"friend";i:1;s:11:"user_status";i:1;s:4:"poll";i:1;s:4:"quiz";i:1;s:6:"market";i:1;s:4:"apps";i:1;}
让我们中断序列化字符串并将其与序列化对象进行比较。
a:10
—a
表示Array
($aFilter = Array()
),数字10
表示数组中元素的个数。
s:5:"pages"
——s
代表String
, 5
代表值的长度——因为它是一个字符串,我们可以说这是字符串中的字符数量。"pages"
是值本身。(s:5:"photo"
, s:4:"link"
等相同)
i:1
—i
为数字Integer
, 1
为值
例如,如果不是'pages' => 1,
,而是'bla' => 4,
特定的序列化部分将是:s:3:"bla";i:4;
"s"answers"i"保持不变,因为我们没有改变值的类型,但我们有3
,而不是5
,因为bla
有3个字符,而pages
有5个字符,我们有i:4
,而不是i:1
,因为现在该键的值是4
而不是1
。
为了理解这一部分,我们需要注意到我们正在序列化一个数组。所以引擎需要理解哪个部分是关键,哪个部分是值。$array = array($key => $value)
;
在序列化字符串中,你会注意到:s:5:"pages";i:1;
s:5:"photo";i:1;
这只是一个顺序问题,首先是key
,然后是value
,然后再来一次。(当然与;
分开)。
我不得不提到@svengaly附加的链接这解释了序列化字符串的整个"结构"。如果您对进一步的解释和其他场景感兴趣,建议您概述一下。66147年http://php.net/manual/en/function.serialize.php
您的序列化数组的读取方式如下:
a:10:{ // array: 10 elements
s:5:"pages"; // string: 5 characters, value "pages"
i:1; // integer: value "1" (no number of digits is used for integers)
等等