首页 >后端开发 >php教程 >我们如何有效地将 PHP 数组的 var_dump 输出转换回可用的数组变量?

我们如何有效地将 PHP 数组的 var_dump 输出转换回可用的数组变量?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-27 01:46:02659浏览

How can we effectively convert a PHP array's var_dump output back into a usable array variable?

将数组的 var_dump 转换回数组变量

简介

从数组中检索原始数组它的 var_dump 输出可能是一项艰巨的任务。本文探讨了在 PHP 中解决这一挑战的创造性方法。

挑战描述

给定一个包含多维元素的数组,目标是构造一个可重用的函数来重新转换var_dump 输出返回到 PHP 数组变量中。此函数应该高效并能处理复杂的数组结构。

朴素方法

尝试使用正则表达式反转 var_dump 输出可能不是最佳选择。解析和重新组装复杂的语法很容易出错。

优化解决方案

一种创造性的方法是将 var_dump 输出转换为序列化,而不是仅仅依赖正则表达式字符串,然后反序列化它。这有效地重新创建了数组结构。

实现

以下代码定义了实现上述策略的 unvar_dump 函数:

<code class="php">function unvar_dump($str) {
    // Convert output to newline-separated format
    if (strpos($str, "\n") === false) {
        $str = preg_replace(['#(\[.*?\]=>)#', '#(string\(|int\(|float\(|array\(|NULL|object\(|})#'], "\n\1", $str);
        $str = trim($str);
    }
    
    // Perform regex-based replacements to prepare for serialization
    $regex = [
        '#^\040*NULL\040*$#m',
        '#^\s*array\((.*?)\)\s*{\s*$#m',
        '#^\s*string\((.*?)\)\s*(.*?)$#m',
        '#^\s*int\((.*?)\)\s*$#m',
        '#^\s*bool\(true\)\s*$#m',
        '#^\s*bool\(false\)\s*$#m',
        '#^\s*float\((.*?)\)\s*$#m',
        '#^\s*\[(\d+)\]\s*=>\s*$#m',
        '#\s*?\r?\n\s*#m',
    ];
    $replace = [
        'N',
        'a:\1:{',
        's:\1:\2',
        'i:\1',
        'b:1',
        'b:0',
        'd:\1',
        'i:\1',
        ';'
    ];
    $serialized = preg_replace($regex, $replace, $str);
    
    // Handle object and custom string keys using callback functions
    $func = create_function(
        '$match', 
        'return "s:".strlen($match[1]).":\"".$match[1]."\"";'
    );
    $serialized = preg_replace_callback(
        '#\s*\["(.*?)"\]\s*=>#', 
        $func,
        $serialized
    );
    $func = create_function(
        '$match', 
        'return "O:".strlen($match[1]).":\"".$match[1]."\":".$match[2].":{";'
    );
    $serialized = preg_replace_callback(
        '#object\((.*?)\).*?\((\d+)\)\s*{\s*;#', 
        $func, 
        $serialized
    );
    
    $serialized = preg_replace(
        array('#};#', '#{;#'), 
        array('}', '{'), 
        $serialized
    );

    // Unserialize the modified string to reconstruct the array
    return unserialize($serialized);
}</code>

使用示例

要使用此函数,只需提供数组的 var_dump 输出作为输入参数即可。该函数将返回原始数组。

例如,给定以下 var_dump 输出:

array(4) {
  ["foo"]=>
  string(8) "Foo"bar""
  [0]=>
  int(4)
  [5]=>
  float(43.2)
  ["af"]=>
  array(3) {
    [0]=>
    string(3) "123"
    [1]=>
    object(stdClass)#2 (2) {
      ["bar"]=>
      string(4) "bart"
      ["foo"]=>
      array(1) {
        [0]=>
        string(2) "re"
      }
    }
    [2]=>
    NULL
  }
}

unvar_dump 函数将返回原始数组结构:

array(
  "foo" => "Foo"bar"",
  0 => 4,
  5 => 43.2,
  "af" => array(
    0 => "123",
    1 => (object) [
      "bar" => "bart",
      "foo" => array(
        0 => "re"
      )
    ],
    2 => null
  )
)

以上是我们如何有效地将 PHP 数组的 var_dump 输出转换回可用的数组变量?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn