将数组的var_dump转换回数组变量

直到今天,我还没有真正考虑过这一点,但是在网上搜索之后,我什么都没找到。也许我不是在搜索中说正确的话。

给定一个数组(是否具有多个维度):

$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()功能。数据是在浏览器中作为输出全部显示在一行上,还是包含换行符作为输出到终端。

这只是正则表达式的问题吗?还是有其他方法?我正在寻找创造力。

更新:注意。我熟悉序列化和反序列化的人员。我不是在寻找替代解决方案。看看是否可以通过优化和创新的方式来完成代码是一个代码挑战。因此,

这里 。他们也不是最好的答案。

回答:

var_export或者serialize是您要寻找的东西。

var_export将呈现PHP可解析的数组语法,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

}

}

以上是 将数组的var_dump转换回数组变量 的全部内容, 来源链接: utcz.com/qa/398561.html

回到顶部