ホームページ  >  記事  >  バックエンド開発  >  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 は有効な解決策を提供しますが、この課題では創造的で効率的なアプローチが求められます。このようなアプローチの 1 つは、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。