Conversion de var_dump du tableau en variable de tableau
Introduction
Récupération du tableau d'origine de sa sortie var_dump peut être une tâche ardue. Cet article explore des méthodes créatives pour relever ce défi au sein de PHP.
Description du défi
Étant donné un tableau avec des éléments multidimensionnels, l'objectif est de construire une fonction réutilisable qui reconvertit le var_dump renvoie une variable de tableau PHP. Cette fonction doit être efficace et gérer des structures de tableaux complexes.
Approche naïve
Tenter d'inverser la sortie var_dump à l'aide d'expressions régulières n'est peut-être pas optimal. L'analyse et le réassemblage de la syntaxe complexe sont sensibles aux erreurs.
Solution optimisée
Au lieu de s'appuyer uniquement sur des expressions régulières, une approche créative consiste à convertir la sortie var_dump en un fichier sérialisé. chaîne, puis en la désérialisant. Cela recrée efficacement la structure du tableau.
Implémentation
Le code suivant définit la fonction unvar_dump qui implémente la stratégie ci-dessus :
<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>
Exemple d'utilisation
Pour utiliser cette fonction, fournissez simplement la sortie var_dump d'un tableau comme paramètre d'entrée. La fonction renverra le tableau d'origine.
Par exemple, étant donné la sortie var_dump suivante :
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 } }
La fonction unvar_dump renverrait la structure de tableau d'origine :
array( "foo" => "Foo"bar"", 0 => 4, 5 => 43.2, "af" => array( 0 => "123", 1 => (object) [ "bar" => "bart", "foo" => array( 0 => "re" ) ], 2 => null ) )
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!