Rumah >pembangunan bahagian belakang >tutorial php >Bagaimanakah kita boleh menukar output var_dump tatasusunan PHP dengan berkesan kepada pembolehubah tatasusunan yang boleh digunakan?
Menukar var_dump Tatasusunan Kembali kepada Pembolehubah Tatasusunan
Pengenalan
Mendapatkan semula tatasusunan asal daripada output var_dumpnya boleh menjadi tugas yang sukar. Artikel ini meneroka kaedah kreatif untuk menangani cabaran ini dalam PHP.
Penerangan Cabaran
Memandangkan tatasusunan dengan unsur berbilang dimensi, matlamatnya adalah untuk membina fungsi boleh guna semula yang menukar semula var_dump output kembali ke pembolehubah tatasusunan PHP. Fungsi ini harus cekap dan mengendalikan struktur tatasusunan yang kompleks.
Pendekatan Naif
Percubaan untuk membalikkan output var_dump menggunakan ungkapan biasa mungkin tidak optimum. Menghuraikan dan menyusun semula sintaks kompleks terdedah kepada ralat.
Penyelesaian Dioptimumkan
Daripada bergantung semata-mata pada ungkapan biasa, pendekatan kreatif melibatkan penukaran output var_dump menjadi bersiri rentetan dan kemudian menyahsirinya. Ini secara berkesan mencipta semula struktur tatasusunan.
Pelaksanaan
Kod berikut mentakrifkan fungsi unvar_dump yang melaksanakan strategi di atas:
<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>
Contoh Penggunaan
Untuk menggunakan fungsi ini, hanya sediakan output var_dump tatasusunan sebagai parameter input. Fungsi ini akan mengembalikan tatasusunan asal.
Sebagai contoh, memandangkan output var_dump berikut:
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 } }
Fungsi unvar_dump akan mengembalikan struktur tatasusunan asal:
array( "foo" => "Foo"bar"", 0 => 4, 5 => 43.2, "af" => array( 0 => "123", 1 => (object) [ "bar" => "bart", "foo" => array( 0 => "re" ) ], 2 => null ) )
Atas ialah kandungan terperinci Bagaimanakah kita boleh menukar output var_dump tatasusunan PHP dengan berkesan kepada pembolehubah tatasusunan yang boleh digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!