为什么在 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 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" 和 "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
我有一个名为 $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 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" 和 "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