将数组的var_dump转换回数组变量
将数组的var_dump转换回数组变量
我之前从未真正考虑过这个问题,但今天在网上搜索后并没有找到什么结果。也许我的搜索用词不对。
给定一个数组(可以是多维的或者不是):
$data = array('this' => array('is' => 'the'), 'challenge' => array('for' => array('you')));
当进行 var_dump 后:
array(2) { ["this"]=> array(1) { ["is"]=> string(3) "the" } ["challenge"]=> array(1) { ["for"]=> array(1) { [0]=> string(3) "you" } } }
挑战是:将该数组重新编译为可用的 PHP 数组,就像一个 undump_var()
函数一样。无论数据是在浏览器中输出的一行还是包含换行符作为终端输出。
这只是一个正则表达式问题吗?还是还有其他方法?我正在寻找创造性的解决方案。
更新:注意。我熟悉序列化和反序列化。我不是在寻找替代解决方案。这是一个代码挑战,看看是否能以最优化和创造性的方式完成。因此,serialize 和 var_export 在这里都不是解决方案,也不是最佳答案。
问题的原因是代码中存在一些错误,导致无法正确解析某些字符串。解决方法是修复代码中的错误,并将输入中的换行符替换为"\n"。
在这段代码中,通过手动解析字符串来将var_dump的输出转换回数组变量。代码中包含了一些"magic"数字,用于增加字符串位置计数器$i,这些数字主要是一些关键词和括号的字符串长度。
在修复了一个错误后,字符串"ab};cd"得以正确解析。
然而,布尔值true的解析仍然存在问题。修复方法是不再将变量再次传递给strtok()。
修复了布尔值的解析问题后,代码看起来更加简洁,并且能够正确解析布尔值。但是浮点数的解析仍然存在问题,例如浮点数1.5无法正确解析。
有人在测试代码时遇到了问题,无法将var_dump输出的数组正确解析。原因是输入中使用了\r\n作为换行符,而代码中使用的是\n作为换行符。解决方法是将输入中的换行符替换为\n,或者更新代码中负责计算行数的部分的偏移量。
通过对这些问题的修复,可以将var_dump的输出转换回数组变量。
问题:将var_dump输出的数组转换回数组变量的原因和解决方法
当我们想要编码或解码像下面这样的数组时,我们应该使用var_export()函数,该函数会生成PHP数组的输出,例如:
array( 1 => 'foo', 2 => 'bar' )
然而,要将数组转换回原始的数组变量,我们需要使用eval()函数,但这种方法潜在地存在安全隐患(尤其是因为eval()函数实际上执行PHP代码,所以简单的代码注入可能使黑客能够控制您的PHP脚本)。
更好的解决方法是使用serialize()函数,该函数可以创建任何数组或对象的序列化版本;或者使用json_encode()函数,该函数将任何数组或对象编码为JSON格式(JSON格式更适合不同语言之间的数据交换)。
总结起来,通过var_dump输出的数组无法直接转换回数组变量,可以使用var_export()、eval()、serialize()或json_encode()等方法来实现。其中,eval()存在安全隐患,而serialize()和json_encode()是更好的解决方案。
从上述内容中可以整理出以下问题的出现原因和解决方法:
问题:将var_dump输出的数组转换回数组变量
出现原因:var_dump函数将数组以字符串形式输出,无法直接作为数组变量使用。
解决方法:编写一个unvar_dump函数,将var_dump输出的字符串转换为数组变量。
代码如下:
function unvar_dump($str) { if (strpos($str, "\n") === false) { //Add new lines: $regex = array( '#(\[.*?\]=>)#', '#(string\(|int\(|float\(|array\(|NULL|object\(|})#', ); $str = preg_replace($regex, "\n\\1", $str); $str = trim($str); } $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', ';' ); $serialized = preg_replace($regex, $replace, $str); $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 ); return unserialize($serialized); }
该函数将var_dump输出的字符串进行解析和处理,最终返回一个数组变量。
使用该函数的示例:
$var_dump_output = 'array(2) { ["this"]=> array(1) { ["is"]=> string(3) "the" [0]=> array(2) { [0]=> string(3) "one" [1]=> string(4) "only" } } ["challenge"]=> array(1) { ["for"]=> array(2) { [0]=> string(3) "you" [1]=> int(2) } } }'; $array_variable = unvar_dump($var_dump_output); var_dump($array_variable);
上述示例中,将var_dump输出的字符串赋值给$var_dump_output变量,并使用unvar_dump函数将其转换为数组变量$array_variable。最后使用var_dump函数输出$array_variable的内容。
通过以上方法,可以将var_dump输出的数组转换回数组变量,实现了将字符串转换为可用的数组数据。