>  기사  >  백엔드 개발  >  PHP 배열의 var_dump 출력을 다시 사용 가능한 배열 변수로 효과적으로 변환하려면 어떻게 해야 합니까?

PHP 배열의 var_dump 출력을 다시 사용 가능한 배열 변수로 효과적으로 변환하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-27 01:46:02570검색

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