>백엔드 개발 >PHP 튜토리얼 >PHP에 기본 솔루션이 없는 경우 var_dump 출력에서 ​​PHP 배열을 효과적으로 재구성할 수 있는 방법은 무엇입니까?

PHP에 기본 솔루션이 없는 경우 var_dump 출력에서 ​​PHP 배열을 효과적으로 재구성할 수 있는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-29 22:47:29744검색

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으로 문의하세요.