PHP中如何将数组格式的字符串转换为原生数组
为什么
(array)强转不生效 PHP的(array)强制类型转换不会解析字符串内部的数组语法结构,按照PHP的类型转换规则,把字符串强转成数组时,只会得到一个长度为1、元素就是原字符串本身的数组,自然达不到预期效果。
实现方案
根据字符串的来源可信度,选对应方案即可:
- 若字符串完全来自内部可信输出、无任何用户可控内容,解析效率最高的方式是用
eval执行合法PHP代码解析:
$rawStr = '[ 2 => ["Iphone 10", "Iphone 20", "Iphone 30", "Iphone 40"], 3 => ["Mac 10", "Mac 20", "Mac 30", "Mac 40"] ]'; eval('$arr = ' . $rawStr . ';'); // 此时$arr就是目标PHP原生数组
安全警示:
eval会直接执行传入的任意PHP代码,绝对不要对来源不可信、包含用户输入内容的字符串使用该方法,否则会直接引发代码注入漏洞,导致服务器被接管。
- 若字符串来源不可信,不要用
eval,可以先把字符串转换为标准JSON格式,再通过PHP内置的json_decode解析,针对你给出的这个固定结构的字符串,转换示例如下:
$rawStr = '[ 2 => ["Iphone 10", "Iphone 20", "Iphone 30", "Iphone 40"], 3 => ["Mac 10", "Mac 20", "Mac 30", "Mac 40"] ]'; // 替换PHP数组的键名=>语法为JSON的键:语法 $json = preg_replace('/(\d+)\s*=>\s*/', '"$1":', $rawStr); // 替换外层带指定键的数组符号为JSON对象符号 $json = preg_replace('/^\s*\[/', '{', $json); $json = preg_replace('/\]\s*$/', '}', $json); $arr = json_decode($json, true);
如果是更复杂的嵌套数组结构,建议单独写对应格式的解析器,避免正则替换误伤内容。
- 长期优化建议:如果是自身业务中需要存储、传递数组数据,不要直接打印数组结构存成字符串,直接用
json_encode做序列化存储,读取时用json_decode解析即可,性能、安全性、兼容性都远好于手动解析打印出来的数组字符串。
内容的提问来源于stack exchange,提问作者djoo
相关产品推荐
相关产品推荐

