首页  >  文章  >  后端开发  >  鉴于 PHP 中缺乏本机解决方案,如何从 var_dump 输出有效地重建 PHP 数组?

鉴于 PHP 中缺乏本机解决方案,如何从 var_dump 输出有效地重建 PHP 数组?

Susan Sarandon
Susan Sarandon原创
2024-10-29 22:47:29661浏览

How can you effectively reconstruct a PHP array from its var_dump output, given the lack of a native solution in PHP?

从 var_dump 输出中恢复数组结构

简介:

PHP 中存在一个经常被忽视的挑战,即需要从 var_dump 输出重建数组。这个看似简单的任务在 PHP 中缺乏原生解决方案,但却激发了开发人员的创造力。

问题陈述:

给定一个数组,无论其维度如何,输出其 var_dump表示:

<code class="php">$data = array('this' => array('is' => 'the'), 'challenge' => array('for' => array('you')));

$var_dump_output = array(2) 
{
    ["this"]=> array(1) ["is"]=> string(3) "the"
    ["challenge"]=> array(1) ["for"]=> array(1) [0]=> string(3) "you"
}</code>

挑战是设计一种优化方法,将此 var_dump 表示转换回可用的 PHP 数组。

解决方案:

虽然序列化和 var_export 提供了有效的解决方案,但这一挑战寻求创造性和有效的方法。其中一种方法是将 var_dump 输出转换为序列化字符串,然后将其反序列化。

<code class="php">function unvar_dump($str) {
    // Add new lines for improved readability
    if (strpos($str, "\n") === false) {
        $str = preg_replace(['#(\[.*?\]=>)#', '#(string\(|int\(|float\(|array\(|NULL|object\(|})#'], "\n\1", $str);
        $str = trim($str);
    }

    // Regular expressions for pattern matching
    $regex = array(
        '#^\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 = array(
        'N',
        'a:\1:{',
        's:\1:\2',
        'i:\1',
        'b:1',
        'b:0',
        'd:\1',
        'i:\1',
        ';'
    );

    // Convert to serialized string
    $serialized = preg_replace($regex, $replace, $str);

    // Handle string keys
    $func = create_function('$match', 'return "s:".strlen($match[1]).":\"".$match[1]."\"";');
    $serialized = preg_replace_callback('#\s*\["(.*?)"\]\s*=>#', $func, $serialized);

    // Handle objects
    $func = create_function('$match', 'return "O:".strlen($match[1]).":\"".$match[1]."\":".$match[2].":{";');
    $serialized = preg_replace_callback('#object\((.*?)\).*?\((\d+)\)\s*{\s*;#', $func, $serialized);

    // Finalize serialized string
    $serialized = preg_replace(['#};#', '#{;#'], ['}', '{'], $serialized);

    // Unserialize and return the array
    return unserialize($serialized);
}</code>

示例用法:

<code class="php">$complex_array = array(
    "foo" => "Foo\"bar\"",
    0 => 4,
    5 => 43.2,
    "af" => array(
        0 => "123",
        1 => (object)[
            "bar" => "bart",
            "foo" => ["re"]
        ],
        2 => NULL
    )
);

$var_dump_output = var_export($complex_array, true);
$reconstructed_array = unvar_dump($var_dump_output);

// Verify if the reconstructed array matches the original
var_dump($complex_array === $reconstructed_array); // Outputs: bool(true)</code>

此解决方案提供了一种实用且从 var_dump 输出重建数组的优化方法,展示了 PHP 中数据操作的替代方法。

以上是鉴于 PHP 中缺乏本机解决方案,如何从 var_dump 输出有效地重建 PHP 数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

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