
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;如果需要高效存储和传输,推荐使用序列化。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。


