print_r
是 PHP 中用于打印变量(如数组、对象)的调试函数。它会将数组或对象转换为可读的字符串格式。如果需要将 print_r
输出的字符串还原为原始数组,可以使用以下方法。
方法 1:使用 eval()
函数(不推荐)
print_r
输出的字符串格式与 PHP 数组语法非常相似,因此可以通过 eval()
函数将其还原为数组。但这种方法存在安全风险,因为 eval()
会执行任意 PHP 代码。
示例代码
<?php// 原始数组$originalArray = [ 'name' => 'John', 'age' => 30, 'hobbies' => ['reading', 'swimming'],];// 使用 print_r 输出数组$printOutput = print_r($originalArray, true);// 将 print_r 输出还原为数组$arrayString = '$recoveredArray = ' . $printOutput . ';';eval($arrayString);// 输出还原后的数组print_r($recoveredArray);?>
输出结果
Array( [name] => John [age] => 30 [hobbies] => Array ( [0] => reading [1] => swimming ))
注意事项
安全问题:
eval()
会执行任意 PHP 代码,如果print_r
输出的字符串来自不可信的来源,可能会导致代码注入漏洞。不推荐使用:除非完全信任输入数据,否则应避免使用
eval()
。
方法 2:使用正则表达式解析(推荐)
通过正则表达式解析 print_r
输出的字符串,可以安全地将其还原为数组。
示例代码
<?php// 原始数组$originalArray = [ 'name' => 'John', 'age' => 30, 'hobbies' => ['reading', 'swimming'],];// 使用 print_r 输出数组$printOutput = print_r($originalArray, true);// 自定义函数将 print_r 输出还原为数组function print_r_reverse($input) { $lines = explode("\n", trim($input)); $result = []; $stack = []; $current = &$result; foreach ($lines as $line) { $line = trim($line); if (preg_match('/^\[(.+)\] => (.+)$/', $line, $matches)) { $key = $matches[1]; $value = $matches[2]; if ($value === 'Array') { $current[$key] = []; $stack[] = &$current; $current = &$current[$key]; } else { $current[$key] = $value; } } elseif ($line === ')') { $current = &$stack[count($stack) - 1]; array_pop($stack); } } return $result;}// 还原数组$recoveredArray = print_r_reverse($printOutput);// 输出还原后的数组print_r($recoveredArray);?>
输出结果
Array( [name] => John [age] => 30 [hobbies] => Array ( [0] => reading [1] => swimming ))
代码说明
解析
print_r
输出:使用正则表达式匹配
[key] => value
格式的字符串。如果值是
Array
,表示嵌套数组,递归处理。处理嵌套数组:
使用栈(
$stack
)保存当前数组的引用,以便处理嵌套数组。返回结果:
返回解析后的数组。
方法 3:使用 var_export
和 eval()
(推荐)
var_export
是另一种调试函数,它会将变量导出为合法的 PHP 代码。结合 eval()
,可以安全地将输出还原为数组。
示例代码
<?php// 原始数组$originalArray = [ 'name' => 'John', 'age' => 30, 'hobbies' => ['reading', 'swimming'],];// 使用 var_export 输出数组$exportOutput = var_export($originalArray, true);// 将 var_export 输出还原为数组eval('$recoveredArray = ' . $exportOutput . ';');// 输出还原后的数组print_r($recoveredArray);?>
输出结果
Array( [name] => John [age] => 30 [hobbies] => Array ( [0] => reading [1] => swimming ))
优点
var_export
输出的字符串是合法的 PHP 代码,可以直接通过eval()
还原。比
print_r
更安全,因为var_export
的输出格式更规范。
注意事项
仍然需要谨慎使用
eval()
,确保输入数据可信。
方法 4:使用序列化和反序列化
如果不需要人类可读的输出,可以使用 serialize
和 unserialize
函数。
示例代码
<?php// 原始数组$originalArray = [ 'name' => 'John', 'age' => 30, 'hobbies' => ['reading', 'swimming'],];// 序列化数组$serialized = serialize($originalArray);// 反序列化还原数组$recoveredArray = unserialize($serialized);// 输出还原后的数组print_r($recoveredArray);?>
输出结果
Array( [name] => John [age] => 30 [hobbies] => Array ( [0] => reading [1] => swimming ))
优点
简单高效,适合存储和传输数据。
不需要解析字符串。
缺点
输出不是人类可读的。
总结
方法 | 优点 | 缺点 |
---|---|---|
eval() + print_r | 简单 | 不安全,不推荐使用 |
正则解析 print_r | 安全,可控 | 需要编写解析逻辑 |
eval() + var_export | 安全,输出规范 | 需要谨慎使用 eval() |
序列化/反序列化 | 高效,适合存储和传输 | 输出不是人类可读的 |
根据实际需求选择合适的方法。如果需要人类可读的输出,推荐使用 var_export
;如果需要高效存储和传输,推荐使用序列化。
本文关键词: php print 处理 后的 数据 原为
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。