在PHP开发中,关联数组是非常常用的数据结构,很多时候我们需要将其转换成字符串形式,比如存入数据库、写入缓存或者进行接口传输。如果转换方式不当,很容易导致数据丢失、格式错误甚至引发安全问题,因此需要掌握正确的转换方法。
不推荐的转换方式
很多新手开发者会尝试用字符串拼接的方式转换关联数组,这种方式存在明显缺陷,比如数组元素包含特殊字符时会出现格式错误,示例代码如下:
<?php
$user = [
'name' => '张三',
'age' => 25,
'desc' => '喜欢"编程"和&开发'
];
// 直接拼接字符串,特殊字符会导致结果异常
$str = '';
foreach ($user as $key => $value) {
$str .= $key . ':' . $value . ',';
}
echo rtrim($str, ',');
// 输出结果:name:张三,age:25,desc:喜欢"编程"和&开发,后续解析时无法还原原始数组
安全转换方法一:使用serialize函数
serialize是PHP内置的序列化函数,可以将任意类型的PHP值转换为可存储的字符串,并且能完整保留数组的结构和特殊字符,转换后的字符串可以通过unserialize还原为原始数组。
<?php
$user = [
'name' => '张三',
'age' => 25,
'desc' => '喜欢"编程"和&开发'
];
// 序列化关联数组
$serializedStr = serialize($user);
echo $serializedStr;
// 输出:a:3:{s:4:"name";s:6:"张三";s:3:"age";i:25;s:4:"desc";s:20:"喜欢"编程"和&开发";}
// 还原数组
$originalArr = unserialize($serializedStr);
print_r($originalArr);
这种方式适合仅在PHP环境内部使用的场景,比如缓存存储,缺点是序列化后的字符串仅能被PHP识别,其他语言无法解析。
安全转换方法二:使用json_encode函数
json_encode可以将关联数组转换为JSON格式的字符串,JSON是通用数据格式,支持几乎所有编程语言解析,适合跨语言传输或者接口数据交互的场景。
<?php
$user = [
'name' => '张三',
'age' => 25,
'desc' => '喜欢"编程"和&开发'
];
// 转换为JSON字符串,第二个参数保证中文不被转义
$jsonStr = json_encode($user, JSON_UNESCAPED_UNICODE);
echo $jsonStr;
// 输出:{"name":"张三","age":25,"desc":"喜欢"编程"和&开发"}
// 还原数组
$originalArr = json_decode($jsonStr, true);
print_r($originalArr);
如果数组中包含中文,建议加上JSON_UNESCAPED_UNICODE参数,否则中文会被转成Unicode编码,不利于阅读和后续处理。
安全转换方法三:使用http_build_query函数
如果转换后的字符串需要用于URL参数拼接,可以使用http_build_query函数,它会自动对特殊字符进行URL编码,避免参数解析错误。
<?php
$params = [
'page' => 1,
'keyword' => 'PHP 数组',
'sort' => 'time'
];
// 转换为URL参数字符串
$queryStr = http_build_query($params);
echo $queryStr;
// 输出:page=1&keyword=PHP+%E6%95%B0%E7%BB%84&sort=time
// 解析字符串还原为数组
parse_str($queryStr, $originalArr);
print_r($originalArr);
不同方法对比
我们可以根据实际需求选择合适的方法,以下是几种方法的特性对比:
| 转换方法 | 适用场景 | 可还原性 | 跨语言支持 |
|---|---|---|---|
| serialize | PHP内部缓存、临时存储 | 完整还原 | 仅PHP支持 |
| json_encode | 接口传输、跨语言交互、通用存储 | 完整还原 | 全语言支持 |
| http_build_query | URL参数拼接、表单数据提交 | 完整还原 | 通用URL格式支持 |
注意事项
- 如果关联数组中包含资源类型(比如文件句柄、数据库连接),serialize可以序列化但无法正确还原,这类数组不适合用序列化方式转换。
- 使用json_encode时,如果数组中包含回调函数或者对象实例,需要先处理成可序列化的值再转换。
- 转换后的字符串如果用于存储,需要根据字符串长度选择合适的存储字段,避免长度不足导致数据截断。
PHP关联数组字符串转换serializejson_encode修改时间:2026-06-27 00:36:33