2011-07-23 116 views
3

有时候,我通过某些API获取大量数据,并将其保存到一个简单的var_dump或print_r平面文件中。我现在正在处理数据,并在每行的样子:将字符串转换为数组PHP

“ 'MIDDLE_INITIAL'=> '', 'SID'=> '1419843', '固定'=> 'Y', “cart_weight '=>'0','key'=>'ABCD','state'=>'XX','last_name' =>'MNOP','email'=>'[email protected]','city '=> '伦敦', 'STREET_ADDRESS'=> '样品', 'FIRST_NAME'=> 'Sparsh',”

现在我需要把这些数据放到一个数组格式。有没有办法可以做到这一点?

+0

如果这是一次性的事情,您可以将其复制并粘贴到文件中并让PHP解析它。否则,你可能会考虑'eval()',但如果你这样做的话要非常小心。 – Brad

+0

那么,如果你可以再次从api中获取数据,那么显而易见的解决方案就是将你的保存过程修改为'serialize()'数组,然后你只需要获取文件的文本并执行'unserialize($ text)'' – prodigitalson

回答

6

什么第一爆炸字符串与explode()功能,采用', '作为分隔符:

$str = "'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => '[email protected]', 'city' => 'London', 'street_address' => 'Sample', 'first_name' => 'Sparsh',"; 
$items = explode(', ', $str); 
var_dump($items); 

这将让你的数组看起来像这样:

array 
    0 => string ''middle_initial' => ''' (length=22) 
    1 => string ''sid' => '1419843'' (length=18) 
    2 => string ''fixed' => 'Y'' (length=14) 
    3 => string ''cart_weight' => '0'' (length=20) 
    ... 


而且,当时,迭代该列表,匹配=>每一边的每个项目,并使用=>的第一面作为结果数据的关键字,而第二个作为值:

$result = array(); 
foreach ($items as $item) { 
    if (preg_match("/'(.*?)' => '(.*?)'/", $item, $matches)) { 
     $result[ $matches[1] ] = $matches[2]; 
    } 
} 
var_dump($result); 

这将让你:


但是,严重的是,你不应该将数据存储在这样一个可怕的格式:print_r()进行到显示数据,为了调试的目的 - 不要存储它以后重新加载它!

如果你想将数据存储到一个文本文件,使用serialize()json_encode(),它可以同时分别使用unserialize()json_decode(),可以恢复。

+3

我只是意识到:这个答案是我的第3,000在stackoverflow ;-) –

0

SerializeUnserialize而不是var_dump一起工作会更好也更容易。

在形式

,也许你可以尝试

explode(' => ', $string) 

,然后再通过数组,并把对一起在一个新的数组。

-1

只要它是print_r的输出和一个数组,你可以使用我的小号print_r converter,PHP的源代码可用链接。

标记器基于正则表达式,因此您可以将它用于您的需要。解析器处理形成PHP数组值。

您可以在我的个人资料页面上找到最新版本。

+0

@Downvoter:请分享你的想法。 – hakre

1

尽管我完全同意Pascal Martin的看法,但如果您有这类数据需要处理,以下(如Pascal的第一条建议所述)可以根据您的实际内容工作。但是,请自己帮忙,并将数据存储为可以可靠地放回到PHP数组(格式化,JSON,CSV等)的格式。

<pre> 
<?php 

$str = "\" 'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => '[email protected]', 'city' => 'London', 'street_address' => 'Sample', 'first_name' => 'Sparsh',\""; 

function myStringToArray($str) { 
    $str = substr($str, 1, strlen(substr($str, 0, strlen($str)-2))); 
    $str = str_replace("'",'',$str); 
    $strs = explode(',', $str); 
    $arr = array(); 
    $c_strs = count($strs); 
    for ($i = 0; $i < $c_strs; $i++) { 
     if (strpos($strs[$i],'=>') !== false) { 
      $_arr = explode('=>',$strs[$i]); 
      $arr[trim($_arr[0])] = trim($_arr[1]); 
     } 
    } 
    return $arr; 
} 

print_r(myStringToArray($str)); 

?> 
</pre> 

http://jfcoder.com/test/substr.php

注意,你需要调整的功能,如果你有逗号的数组成员的内容中(例如,使用关于', '令牌帕斯卡的建议)。