Maison >développement back-end >tutoriel php >Comment reconstruire efficacement un tableau PHP à partir de sa sortie var_dump, étant donné l'absence de solution native en PHP ?
Introduction :
Souvent négligé, il existe un défi en PHP où l'on peut rencontrer le besoin de reconstruire un tableau à partir de sa sortie var_dump. Cette tâche apparemment simple ne dispose pas d'une solution native en PHP et a suscité la créativité des développeurs.
Énoncé du problème :
Étant donné un tableau, quelle que soit sa dimensionnalité, affiche son var_dump représentation :
<code class="php">$data = array('this' => array('is' => 'the'), 'challenge' => array('for' => array('you'))); $var_dump_output = array(2) { ["this"]=> array(1) ["is"]=> string(3) "the" ["challenge"]=> array(1) ["for"]=> array(1) [0]=> string(3) "you" }</code>
Le défi est de concevoir une méthode optimisée pour reconvertir cette représentation var_dump en un tableau PHP utilisable.
Solution :
Bien que la sérialisation et var_export offrent des solutions valables, ce défi recherche des approches créatives et efficaces. Une de ces approches consiste à convertir la sortie var_dump en une chaîne sérialisée, puis à la désérialiser.
<code class="php">function unvar_dump($str) { // Add new lines for improved readability if (strpos($str, "\n") === false) { $str = preg_replace(['#(\[.*?\]=>)#', '#(string\(|int\(|float\(|array\(|NULL|object\(|})#'], "\n\1", $str); $str = trim($str); } // Regular expressions for pattern matching $regex = array( '#^\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 = array( 'N', 'a:\1:{', 's:\1:\2', 'i:\1', 'b:1', 'b:0', 'd:\1', 'i:\1', ';' ); // Convert to serialized string $serialized = preg_replace($regex, $replace, $str); // Handle string keys $func = create_function('$match', 'return "s:".strlen($match[1]).":\"".$match[1]."\"";'); $serialized = preg_replace_callback('#\s*\["(.*?)"\]\s*=>#', $func, $serialized); // Handle objects $func = create_function('$match', 'return "O:".strlen($match[1]).":\"".$match[1]."\":".$match[2].":{";'); $serialized = preg_replace_callback('#object\((.*?)\).*?\((\d+)\)\s*{\s*;#', $func, $serialized); // Finalize serialized string $serialized = preg_replace(['#};#', '#{;#'], ['}', '{'], $serialized); // Unserialize and return the array return unserialize($serialized); }</code>
Exemple d'utilisation :
<code class="php">$complex_array = array( "foo" => "Foo\"bar\"", 0 => 4, 5 => 43.2, "af" => array( 0 => "123", 1 => (object)[ "bar" => "bart", "foo" => ["re"] ], 2 => NULL ) ); $var_dump_output = var_export($complex_array, true); $reconstructed_array = unvar_dump($var_dump_output); // Verify if the reconstructed array matches the original var_dump($complex_array === $reconstructed_array); // Outputs: bool(true)</code>
Cette solution fournit une solution pratique et méthode optimisée pour reconstruire des tableaux à partir de la sortie var_dump, présentant des approches alternatives de manipulation de données en PHP.
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!