在PHP开发中,我们经常会遇到从接口、文件或表单中获取到的内容是一段字符串,但业务逻辑需要把它当作数组甚至对象数组来操作。严格来说,PHP里的字符串是标量类型,不能直接当成数组用,必须通过内置函数进行解析和转换。理解字符串与数组、对象在内存中的区别,是写好转换代码的前提。
一、使用explode将分隔符字符串转为普通数组
当字符串是以固定符号(如逗号、竖线)拼接而成时,最简单的方式是使用explode函数。它会按照指定分隔符把字符串拆成若干片段,返回一个索引数组。这种方式适合处理自己拼装的轻量数据,比如前端传来的多选值。
下面的例子演示了把一个逗号分隔的字符串转成数组,并过滤掉空项:
<?php
$str = "a, b,, c,d ";
// 按逗号拆分
$arr = explode(',', $str);
// 去除空格并过滤空值
$clean = array_filter(array_map('trim', $arr), function($v) {
return $v !== '';
});
print_r($clean);
// 输出: Array ( [0] => a [1] => b [3] => c [4] => d )
?>
这种方法的优势是性能高、逻辑直观,不需要依赖数据格式规范。但如果原始字符串里本身就包含逗号内容(例如CSV中带引号的字段),直接explode就会切错,此时应该改用str_getcsv函数。
另外要注意,explode只能生成一维索引数组,无法表达嵌套结构。如果业务需要对象数组,就要在拆分后手动封装,例如用foreach把每行数据转成stdClass。
二、使用json_decode解析JSON字符串为数组或对象数组
现代接口绝大多数使用JSON格式。PHP提供了json_decode函数,可以把JSON字符串还原成数组或对象。第二个参数若为true返回关联数组,若为false或省略则返回stdClass对象,嵌套结构会自动变成对象数组或数组的数组。
下面展示一段JSON文本如何转成对象数组,并读取其中属性:
<?php
$json = '[{"id":1,"name":"Tom"},{"id":2,"name":"Lucy"}]';
// 返回对象数组
$list = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
foreach ($list as $obj) {
echo $obj->id . ':' . $obj->name . PHP_EOL;
}
}
// 若需要普通数组,使用 json_decode($json, true)
?>
json_decode的容错很关键。字符串若带BOM头、单引号或不规范编码,会返回null。生产代码中务必用json_last_error检查,而不是盲目使用返回值。对于超大JSON,还应考虑使用JSON扩展的流式解析以避免内存峰值。
对象数组相比关联数组,在IDE里能有更好的属性提示,但无法像数组那样用array_map等函数批量处理。实际项目中,如果后续要做集合运算,建议转成数组;如果只是读字段,对象写法更直观。
三、多行文本与复杂字符串的处理
有时字符串来自textarea,每一行是一条记录。可以用explode("n", $str)按行拆,再对每行做explode或正则提取。处理前最好先用preg_replace清理掉r以及首尾空白。
示例代码如下:
<?php
$text = "apple|2rnbanana|3norange|5";
$lines = explode("n", str_replace("r", "", $text));
$result = [];
foreach ($lines as $line) {
if (trim($line) === '') continue;
list($name, $num) = explode('|', $line);
$result[] = (object)['name' => $name, 'num' => (int)$num];
}
print_r($result);
?>
这种方式组合了两种拆分,适合配置文件或简单导出文本。缺点是层数变多后代码可读性下降,此时可以封装成专门解析函数,或优先推动数据源改为JSON。
无论用哪种转换,都应在入口处校验字符串非空且符合预期格式,防止后续逻辑因null或false报错。把转换过程集中到工具方法里,也能减少重复代码。
四、常见误区与总结
不少初学者会写成$arr = (array)$str,认为强制类型转换就能得到字符数组。实际上把字符串强转数组只会得到仅包含原字符串一个元素的数组,并不是按字符或分隔符拆分。真正要拆字符应用str_split。
还有人混淆了对象数组和数组对象:前者是多个对象的集合,后者在PHP里通常指ArrayObject这类容器类。使用json_decode时明确第二个参数,就能清楚控制得到的是哪一种。
总体来看,PHP将字符串定义成数组或对象数组,核心在于选对解析函数。简单分隔用explode,标准结构用json_decode,多行文本组合拆分即可。把握住数据格式源头,转换代码就会既安全又易维护。
PHP字符串转数组json_decode修改时间:2026-08-05 15:06:39