字符串到对象的转换
问题描述:
我正在循环一个数据库表,其中包含一些与外部API响应相关的数据。字符串到对象的转换
有人拯救响应为文本,就像这样:
object(stdClass)#5 (1) {
["CreateProspectResult"]=>
object(stdClass)#6 (3) {
["State"]=>
string(7) "Success"
["ErrorMessage"]=>
string(0) ""
["ReturnValue"]=>
object(stdClass)#7 (1) {
["ProspectID"]=>
int(304)
}
}
}
我猜原来的开发商在做与<pre>
标签一个var_dump()
,并从字面上保存的响应。
当我遍历表结果时,我想将字符串转换回对象,所以我可以解析它。我失败了,很糟糕。
这是我已经尝试:
<?php
$string = '
object(stdClass)#5 (1) {
["CreateProspectResult"]=>
object(stdClass)#6 (3) {
["State"]=>
string(7) "Success"
["ErrorMessage"]=>
string(0) ""
["ReturnValue"]=>
object(stdClass)#7 (1) {
["ProspectID"]=>
int(304)
}
}
}
';
$xmlObj = simplexml_load_string($string);
echo $xmlObj->CreateProspectResult->State;
?>
PHP不享受我的尝试,给我非对象相关的错误回来。
是否有可能采取这样的字符串并将其转换回对象?
答
我不是100%确定这是否适用于对象(似乎是),但这似乎涵盖了您的问题。
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*float\\((.*?)\\)\\s*$#m',
'#^\\s*\[(\\d+)\\]\\s*=>\\s*$#m',
'#\\s*?\\r?\\n\\s*#m',
);
$replace = array(
'N',
'a:\\1:{',
's:\\1:\\2',
'i:\\1',
'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);
}
更新什么API返回的一个例子您的问题或您不能直接访问该API。除此之外,我不认为有任何准备去转换器从字符串到stdClass。 “ – Prix
”有人将回复保存为文本,如下所示:“--- looooooooool – zerkms
不幸的是,我无法直接访问API。我被告知回复是上面发布的内容。 – coffeemonitor