直到今天,我还没有真正考虑过这一点,但是在网上搜索之后,我什么都没找到。也许我不是在搜索中说正确的话。
给定一个数组(是否具有多个维度):
$data = array('this' => array('is' => 'the'), 'challenge' => array('for' => array('you')));
当var_dumped时:
array(2) { ["this"]=> array(1) { ["is"]=> string(3) "the" } ["challenge"]=> array(1) { ["for"]=> array(1) { [0]=> string(3) "you" } } }
面临的挑战是:将数组重新编译为适用于PHP的可用数组的最佳优化方法是什么?就像一个undump_var()功能。数据是在浏览器中作为输出全部显示在一行上,还是包含换行符作为输出到终端。
undump_var()
这只是正则表达式的问题吗?还是有其他方法?我正在寻找创造力。
更新:注意。我熟悉序列化和反序列化的人员。我不是在寻找替代解决方案。看看是否可以通过优化和创新的方式来完成代码是一个代码挑战。因此, 序列化和var_export在 这里 不是解决方案 。他们也不是最好的答案。
var_export或者serialize是您要寻找的东西。 var_export将呈现PHP可解析的数组语法,serialize并将呈现非人类可读但可逆的“数组到字符串”转换…
var_export
serialize
编辑 好吧,挑战:
基本上,我将输出转换为序列化的字符串(然后将其反序列化)。我并不认为这是完美的,但是它似乎可以在我尝试过的一些非常复杂的结构上工作……
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); }
我在一个复杂的结构上进行了测试,例如:
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 } }