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