ホームページ > バックエンド開発 > PHPチュートリアル > PHP 配列の var_dump 出力を効果的に変換して使用可能な配列変数に戻すにはどうすればよいでしょうか?

PHP 配列の var_dump 出力を効果的に変換して使用可能な配列変数に戻すにはどうすればよいでしょうか?

Mary-Kate Olsen
リリース: 2024-10-27 01:46:02
オリジナル
655 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート