在PHP开发中,Cookie默认只能存储字符串类型的数据,如果直接尝试将数组赋值给Cookie,最终存储的内容会被强制转换为字符串,导致读取时无法还原为原始数组结构,因此需要对数组进行序列化处理后再存储。

方案一:使用serialize序列化数组
serialize是PHP内置的序列化函数,可以将数组、对象等复杂数据类型转换为可存储的字符串,读取时再通过unserialize还原为原始数据。
设置包含数组的Cookie
首先使用serialize处理数组,再通过setcookie函数设置Cookie,注意需要对序列化后的字符串进行URL编码,避免特殊字符导致存储异常。
<?php
// 定义要存储的数组
$user_info = [
'id' => 1001,
'name' => '张三',
'role' => 'admin'
];
// 序列化数组
$serialized_data = serialize($user_info);
// 设置Cookie,有效期1小时,路径为根目录
setcookie('user_info', urlencode($serialized_data), time() + 3600, '/');
?>读取并还原数组
读取Cookie时先获取存储的字符串,进行URL解码后再使用unserialize还原数组,同时需要判断解码和还原过程是否成功,避免异常数据导致错误。
<?php
if (isset($_COOKIE['user_info'])) {
// URL解码
$encoded_data = urldecode($_COOKIE['user_info']);
// 还原数组
$user_info = unserialize($encoded_data);
// 判断还原是否成功
if ($user_info !== false) {
echo '用户ID:' . $user_info['id'] . '<br>';
echo '用户名称:' . $user_info['name'] . '<br>';
echo '用户角色:' . $user_info['role'] . '<br>';
} else {
echo 'Cookie数据还原失败';
}
} else {
echo '未获取到用户Cookie';
}
?>方案二:使用json_encode序列化数组
json_encode可以将数组转换为JSON格式的字符串,这种格式通用性更强,不仅PHP可以解析,其他语言也能正常处理,是更推荐的使用方式。
设置包含数组的Cookie
使用json_encode处理数组后,同样需要进行URL编码再存储到Cookie中。
<?php
// 定义要存储的数组
$cart_list = [
['goods_id' => 1, 'goods_name' => '手机', 'num' => 2],
['goods_id' => 3, 'goods_name' => '耳机', 'num' => 1]
];
// 转换为JSON字符串
$json_data = json_encode($cart_list, JSON_UNESCAPED_UNICODE);
// 设置Cookie
setcookie('cart_list', urlencode($json_data), time() + 3600, '/');
?>读取并还原数组
读取时使用json_decode还原数组,第二个参数传入true可以返回数组格式,而不是默认的对象格式。
<?php
if (isset($_COOKIE['cart_list'])) {
// URL解码
$encoded_data = urldecode($_COOKIE['cart_list']);
// 还原为数组
$cart_list = json_decode($encoded_data, true);
// 判断解析是否成功
if (json_last_error() === JSON_ERROR_NONE) {
foreach ($cart_list as $item) {
echo '商品:' . $item['goods_name'] . ',数量:' . $item['num'] . '<br>';
}
} else {
echo 'Cookie数据解析失败';
}
} else {
echo '未获取到购物车Cookie';
}
?>两种方案的对比
以下是两种序列化方式的区别,开发者可以根据实际需求选择:
| 对比项 | serialize方案 | json_encode方案 |
|---|---|---|
| 通用性 | 仅PHP可解析 | 所有支持JSON的语言都可解析 |
| 数据类型保留 | 可保留对象、资源等PHP特有类型 | 仅支持JSON兼容的数据类型 |
| 字符串长度 | 通常更长 | 通常更短 |
| 安全性 | 需注意unserialize的反序列化漏洞 | 相对更安全 |
注意事项
- Cookie有大小限制,通常单个Cookie不能超过4KB,因此存储的数组数据不能过大,否则会被截断导致无法还原。
- 序列化后的字符串如果包含特殊字符,必须进行URL编码,否则设置Cookie时可能出现异常。
- 如果存储的是敏感数据,不建议放在Cookie中,因为Cookie数据可以被客户端修改,如需存储建议加密后再存储。
- 使用unserialize时,不要直接反序列化不可信的用户输入,避免触发PHP对象注入漏洞。
实际开发中更推荐使用json_encode方案处理数组Cookie,既保证了通用性,也降低了安全风险,同时注意对存储的数据大小做合理限制。
PHPCookie数组数据serializejson_encode修改时间:2026-07-08 21:27:30