PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > 工作总结

php将print_r处理后的数据还原为原始数组的解决方法

管理员 2025-03-06
工作总结
51

print_r 是 PHP 中用于打印变量(如数组、对象)的调试函数。它会将数组或对象转换为可读的字符串格式。如果需要将 print_r 输出的字符串还原为原始数组,可以使用以下方法。


方法 1:使用 eval() 函数(不推荐)

print_r 输出的字符串格式与 PHP 数组语法非常相似,因此可以通过 eval() 函数将其还原为数组。但这种方法存在安全风险,因为 eval() 会执行任意 PHP 代码。

示例代码

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);?>

输出结果

php
复制
Array(
    [name] => John    [age] => 30
    [hobbies] => Array
        (
            [0] => reading            [1] => swimming        ))

注意事项

  • 安全问题eval() 会执行任意 PHP 代码,如果 print_r 输出的字符串来自不可信的来源,可能会导致代码注入漏洞。

  • 不推荐使用:除非完全信任输入数据,否则应避免使用 eval()


方法 2:使用正则表达式解析(推荐)

通过正则表达式解析 print_r 输出的字符串,可以安全地将其还原为数组。

示例代码

php
复制
<?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);?>

输出结果

php
复制
Array(
    [name] => John    [age] => 30
    [hobbies] => Array
        (
            [0] => reading            [1] => swimming        ))

代码说明

  1. 解析 print_r 输出

    • 使用正则表达式匹配 [key] => value 格式的字符串。

    • 如果值是 Array,表示嵌套数组,递归处理。

  2. 处理嵌套数组

    • 使用栈($stack)保存当前数组的引用,以便处理嵌套数组。

  3. 返回结果

    • 返回解析后的数组。


方法 3:使用 var_export 和 eval()(推荐)

var_export 是另一种调试函数,它会将变量导出为合法的 PHP 代码。结合 eval(),可以安全地将输出还原为数组。

示例代码

php
复制
<?php// 原始数组$originalArray = [
    'name' => 'John',
    'age' => 30,
    'hobbies' => ['reading', 'swimming'],];// 使用 var_export 输出数组$exportOutput = var_export($originalArray, true);// 将 var_export 输出还原为数组eval('$recoveredArray = ' . $exportOutput . ';');// 输出还原后的数组print_r($recoveredArray);?>

输出结果

php
复制
Array(
    [name] => John    [age] => 30
    [hobbies] => Array
        (
            [0] => reading            [1] => swimming        ))

优点

  • var_export 输出的字符串是合法的 PHP 代码,可以直接通过 eval() 还原。

  • 比 print_r 更安全,因为 var_export 的输出格式更规范。

注意事项

  • 仍然需要谨慎使用 eval(),确保输入数据可信。


方法 4:使用序列化和反序列化

如果不需要人类可读的输出,可以使用 serialize 和 unserialize 函数。

示例代码

php
复制
<?php// 原始数组$originalArray = [
    'name' => 'John',
    'age' => 30,
    'hobbies' => ['reading', 'swimming'],];// 序列化数组$serialized = serialize($originalArray);// 反序列化还原数组$recoveredArray = unserialize($serialized);// 输出还原后的数组print_r($recoveredArray);?>

输出结果

php
复制
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修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部