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

14 浏览
0 Comments

将数组的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 在这里都不是解决方案,也不是最佳答案。

0
0 Comments

问题的原因是代码中存在一些错误,导致无法正确解析某些字符串。解决方法是修复代码中的错误,并将输入中的换行符替换为"\n"。

在这段代码中,通过手动解析字符串来将var_dump的输出转换回数组变量。代码中包含了一些"magic"数字,用于增加字符串位置计数器$i,这些数字主要是一些关键词和括号的字符串长度。

在修复了一个错误后,字符串"ab};cd"得以正确解析。

然而,布尔值true的解析仍然存在问题。修复方法是不再将变量再次传递给strtok()。

修复了布尔值的解析问题后,代码看起来更加简洁,并且能够正确解析布尔值。但是浮点数的解析仍然存在问题,例如浮点数1.5无法正确解析。

有人在测试代码时遇到了问题,无法将var_dump输出的数组正确解析。原因是输入中使用了\r\n作为换行符,而代码中使用的是\n作为换行符。解决方法是将输入中的换行符替换为\n,或者更新代码中负责计算行数的部分的偏移量。

通过对这些问题的修复,可以将var_dump的输出转换回数组变量。

0
0 Comments

问题:将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()是更好的解决方案。

0
0 Comments

从上述内容中可以整理出以下问题的出现原因和解决方法:

问题:将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输出的数组转换回数组变量,实现了将字符串转换为可用的数组数据。

0