2011-07-23 148 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

注意,你需要調整的功能,如果你有逗號的數組成員的內容中(例如,使用關於', '令牌帕斯卡的建議)。