如何将字符串转换为数组

时间:2016-06-02 04:27:25

标签: php arrays regex drupal

我将此字符串保存在我的数据库中:

'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,它不能像那样工作。我尝试了一些字符串替换来切换它们并添加一些逗号,但我的正则表达式并不是那么好。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

那里有一个问题。如果可以更改该值记录到数据库的方式,我强烈建议您使用json_encodejson_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]);
   }
 }