将数组的 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中文网其他相关文章!