为什么在 PHP 中对关联数组调用序列化后添加的数字很少?

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

请帮助我理解这件事。

谢谢。

你的序列化数组读取如下:

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)

等等

先了解一下serializing的意思。

Serialize ,根据手册:

Generates a storable representation of a value

所以我们基本上需要用字符串来描述任何值,这样我们以后也可以反序列化它。因此,我们将看到一个描述序列化值的模式,其中当然通常包含 type of valuelengthvalue

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" 和 "i" 保持不变,因为我们没有改变值的类型, 但是 5 我们有 3 因为 bla 有 3 个字符,而 pages 有 5 个字符,而不是 i:1 我们有 i:4 因为现在该键的值是 4 而不是 1.

为了理解这部分,我们需要注意我们正在序列化一个数组。所以引擎需要了解哪部分是键,哪部分是值。 $array = array($key => $value);

在序列化字符串中,您会注意到: s:5:"pages";i:1; s:5:"photo";i:1; 这只是一个顺序问题,首先是 key,然后是 value,然后再重复一遍。(当然是用 ; 分隔)。

我不得不提一下@svengaly 附加的 link 这解释了序列化字符串的整个 "anatomy" 。如果您对进一步的解释和其他场景感兴趣,建议对其进行概述。 http://php.net/manual/en/function.serialize.php#66147