我将此字符串保存在我的数据库中:
'Array\n
(\n
[id] => xxx111\n
[amount] => 2000\n
[currency] => usd\n
[created] => xxx222\n
[object] => refund\n
[balance_transaction] => xxx333\n
[charge] => xxx444\n
[receipt_number] => xxx555\n
[reason] => requested_by_customer\n
)'
我需要解析一下into和array()。 \n
似乎不在数据库中,只是当我检索它们并且我检查Xdebug中的值时,\n
会显示。
我尝试过像这样使用eval()
:
eval('$my_array = ' . $string_from_db . ';');
但是由于索引的[]
而不是""
s,它不能像那样工作。我尝试了一些字符串替换来切换它们并添加一些逗号,但我的正则表达式并不是那么好。
任何帮助都将不胜感激。
答案 0 :(得分:1)
那里有一个问题。如果可以更改该值记录到数据库的方式,我强烈建议您使用json_encode和json_decode。
如果你不能,那就是:
$a = "Array\n
(\n
[id] => xxx111\n
[amount] => 2000\n
[currency] => usd\n
[created] => xxx222\n
[object] => refund\n
[balance_transaction] => xxx333\n
[charge] => xxx444\n
[receipt_number] => xxx555\n
[reason] => requested_by_customer\n
)";
function parse_key($str) {
preg_match('/\[([^]]+)\]/', $str, $m);
return $m[1];
}
function array_from_nasty_string($s) {
return array_reduce(array_slice(preg_split("/\n+/", $s), 2, -1), function($b, $x) {
list($key, $value) = preg_split('/\s*=>\s*/', $x);
$b[parse_key($key)] = $value;
return $b;
}, []);
}
var_dump(array_from_nasty_string($a));
输出
array(9) {
["id"]=>
string(6) "xxx111"
["amount"]=>
string(4) "2000"
["currency"]=>
string(3) "usd"
["created"]=>
string(6) "xxx222"
["object"]=>
string(6) "refund"
["balance_transaction"]=>
string(6) "xxx333"
["charge"]=>
string(6) "xxx444"
["receipt_number"]=>
string(6) "xxx555"
["reason"]=>
string(21) "requested_by_customer"
}
您会注意到所有内容都被视为字符串。甚至像[amount]=>2000\n
之类的东西在此之前可能是一个整数。但是,这几乎是你最好的。
答案 1 :(得分:0)
<?php
$str ='Array\n
(\n
[id] => xxx111\n
[amount] => 2000\n
[currency] => usd\n
[created] => xxx222\n
[object] => refund\n
[balance_transaction] => xxx333\n
[charge] => xxx444\n
[receipt_number] => xxx555\n
[reason] => requested_by_customer\n
)';
preg_match_all("/\[(.*)\].* => (\w+)/", $str, $arr);
$narr ="";
For($i=0;$i<=count($arr[1])-1;$i++) {
$narr[$arr[1][$i]] = $arr[2][$i];
}
Var_dump($narr);
?>
编辑一个有效的方法。用在线php网站测试它。
答案 2 :(得分:0)
凌乱而丑陋,但应该做的伎俩
$array();
$tmparray=explode("\n",$str);
foreach($tmparray as $row){
if(strpos($row,'>')!==false){
$tab2=explode(">",$row);
$array[trim(substr(trim($tab2[0]),1,-3))]=trim($tab2[1]);
}
}