为什么在PHP中对关联数组调用serialize后很少添加数字


Why few numbers are getting added after calling serialize on an associative array in PHP?

我有一个名为$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, lengthvalue

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:10a表示Array ($aFilter = Array()),数字10表示数组中元素的个数。

s:5:"pages"——s代表String, 5代表值的长度——因为它是一个字符串,我们可以说这是字符串中的字符数量。"pages"是值本身。(s:5:"photo", s:4:"link"等相同)

i:1i为数字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)

等等