php 一串数字转数组中_php-将数组的var_dump转换回数组变量

这篇博客探讨了如何通过反射魔术手动解析PHP的序列化字符串,详细介绍了针对不同数据类型的处理方法,包括布尔值、整数、字符串、浮点数、NULL、数组和对象。文中提供了一个自定义的`unserializeDump`函数,该函数能够填充对象的公共属性而不会触发构造函数。此外,还特别提到了对对象支持的实现细节。
摘要由CSDN通过智能技术生成

根据类型的不同,没有其他方法可以手动解析。我没有添加对对象的支持,但是它与数组非常相似。 您只需要做一些反射魔术就可以不仅填充公共属性而且不触发构造函数。

编辑:添加了对对象的支持...反射魔术...

function unserializeDump($str, &$i = 0) {

$strtok = substr($str, $i);

switch ($type = strtok($strtok, "(")) { // get type, before first parenthesis

case "bool":

return strtok(")") === "true"?(bool) $i += 10:!$i += 11;

case "int":

$int = (int)substr($str, $i + 4);

$i += strlen($int) + 5;

return $int;

case "string":

$i += 11 + ($len = (int)substr($str, $i + 7)) + strlen($len);

return substr($str, $i - $len - 1, $len);

case "float":

return (float)($float = strtok(")")) + !$i += strlen($float) + 7;

case "NULL":

return NULL;

case "array":

$array = array();

$len = (int)substr($str, $i + 6);

$i = strpos($str, "\n", $i) - 1;

for ($entries = 0; $entries < $len; $entries++) {

$i = strpos($str, "\n", $i);

$indent = -1 - (int)$i + $i = strpos($str, "[", $i);

// get key int/string

if ($str[$i + 1] == '"') {

// use longest possible sequence to avoid key and dump structure collisions

$key = substr($str, $i + 2, - 2 - $i + $i = strpos($str, "\"]=>\n ", $i));

} else {

$key = (int)substr($str, $i + 1);

$i += strlen($key);

}

$i += $indent + 5; // jump line

$array[$key] = unserializeDump($str, $i);

}

$i = strpos($str, "}", $i) + 1;

return $array;

case "object":

$reflection = new ReflectionClass(strtok(")"));

$object = $reflection->newInstanceWithoutConstructor();

$len = !strtok("(") + strtok(")");

$i = strpos($str, "\n", $i) - 1;

for ($entries = 0; $entries < $len; $entries++) {

$i = strpos($str, "\n", $i);

$indent = -1 - (int)$i + $i = strpos($str, "[", $i);

// use longest possible sequence to avoid key and dump structure collisions

$key = substr($str, $i + 2, - 2 - $i + $i = min(strpos($str, "\"]=>\n ", $i)?:INF, strpos($str, "\":protected]=>\n ", $i)?:INF, $priv = strpos($str, "\":\"", $i)?:INF));

if ($priv == $i) {

$ref = new ReflectionClass(substr($str, $i + 3, - 3 - $i + $i = strpos($str, "\":private]=>\n ", $i)));

$i += $indent + 13; // jump line

} else {

$i += $indent + ($str[$i+1] == ":"?15:5); // jump line

$ref = $reflection;

}

$prop = $ref->getProperty($key);

$prop->setAccessible(true);

$prop->setValue($object, unserializeDump($str, $i));

}

$i = strpos($str, "}", $i) + 1;

return $object;

}

throw new Exception("Type not recognized...: $type");

}

(在增加字符串位置计数器$i时,有很多“魔术”数字,大部分只是关键字的字符串长度和一些括号等)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值