2016-11-24 119 views
0

我有一個包含像數組的字符串:如何將包含數組值的字符串轉換爲PHP數組?

$tarray = Array ([gt_ref_id] => 36493115 [tender_notice_type] => [organisation_name] => ROSALES WATER DISTRICT [address] => No. 5 Bonifacio Street [address2] => [contact_person] => [tender_notice_no] => ROSALWD 2016-011-0144(Ref: 4206661) 
) 

,但我想訪問這個數組的值,如:

echo "ref id = ".$tarray['gt_ref_id']; 

它應該輸出如下:

ref id = 36493115 

但我不能,因爲它是一個字符串。我可以,如果這是一個數組。

如何將字符串轉換爲適當的PHP數組?

+1

你從哪裏得到這個字符串? –

+0

你爲什麼要將數組表示爲字符串?改用serialize或json_encode。 –

+0

我只是從一個鏈接中得到這個字符串,我通過PHP函數file_get_contents讀取了這個鏈接,它提供了一個數組。因爲這個函數的錯誤,我將該數組作爲字符串。 –

回答

0

如果你想存儲在數據庫中,你的PHP數組可以用json_encodeserialize嘗試,當你需要從你的數據庫retrive數據,你可以使用json_decodeunserialize

使用JSON

例子(存儲爲JSON):

$myArray = array('name' => 'Jack', 'lastname' => 'Smith', 24); 
$toStore = json_encode($myArray); // return a string: {"name":"Jack","lastname":"Smith","0":24} 

mysqli_query($link, 
    'INSERT INTO myTable (data) 
    VALUES ("' . mysqli_real_escape_string($link, $toStore) . '")' 
); 

實例(從JSON檢索):

$query = mysqli_query($link, 'SELECT FROM MyTable WHERE id = ...'); 
$row = mysqli_fetch_assoc($query); 
$row = json_decode($row); // return a array: array('name' => 'Jack', 'lastname' => 'Smith', 24) 

使用serialize

示例(商店序列化): $ myArray = array('name'=>'Jack','lastname'=>'Smith',24); $ toStore = serialize($ myArray); //返回一個字符串:a:3:{s:4:「name」; s:4:「Jack」; s:8:「lastname」; s:5:「Smith」; i:0; i:24 ;}

mysqli_query($link, 
    'INSERT INTO myTable (data) 
    VALUES ("' . mysqli_real_escape_string($link, $toStore) . '")' 
); 

實例(檢索序列):

$query = mysqli_query($link, 'SELECT FROM MyTable WHERE id = ...'); 
$row = mysqli_fetch_assoc($query); 
$row = unserialize($row); // return a array: array('name' => 'Jack', 'lastname' => 'Smith', 24) 

後:

如果需要訪問您從轉換後的數組數據,可以調用這樣的:

$row['name'] // return "Jack" 

另一種方式

正則表達式:

您可以嘗試使用正則表達式,但這不是最好的方式,因爲有時太慢處理數據,也許,如果你不知道安全問題,這絕對不是最好的方法。

標記者:

您可以嘗試創建自己的令牌處理器,喜歡的模板引擎,但是這是最大的方式...

瞭解更多的功能:

優點:

  1. 支持多種數據類型:多維arrayobjectintegerfloatstring,許多除resource更多的數據。
  2. 自PHP4以來本地支持serializeunserialize
  3. 本機支持json_encodejson_decode自PHP 5.2.0以來
  4. 快速和安全的編碼和解碼。
+0

哎@Olaf Erlandsen謝謝...... ** json_decode **爲我工作。 –

0

正如Olaf Erlandsen所建議的,您應該可以將數組以另一種格式存儲 - 序列化或作爲json轉儲。我更喜歡後者。

然而,很可能你並不是產生這個(相當奇怪)字符串的人。它可能由其他人提供。在這種情況下,您可以使用正則表達式(RegEx)來提取數組的鍵和值。

您可以使用preg_match_all()來匹配它們,然後遍歷匹配將它們連接成一個數組。當設置了PREG_SET_ORDER標誌時,我發現更容易循環播放結果。

示例代碼:

$string = "Array ([gt_ref_id] => 36493115 [tender_notice_type] => hiha [organisation_name] => ROSALES WATER DISTRICT [address] => No. 5 Bonifacio Street [address2] => [contact_person] => [tender_notice_no] => ROSALWD 2016-011-0144(Ref: 4206661))"; 
$string = substr($string, 8); # Strip Array (, from beginning of string. 
$string = substr($string, 0, - 1); # Strip last) from string. 

preg_match_all("/\[(.*?)\] => ([^\[]*)/", $string, $matches, PREG_SET_ORDER); 

foreach ($matches as $match) { 
    $tarray[ $match[1] ] = substr($match[2], 0, - 1); 
    # Note that $match[2] contains a trailing white-space, stripping it with substr(). 
    # On another note, you should probably check whether $match[2] has any content. 
} 

var_dump($tarray); 

我把pattern了上regex101,這可能會令事情更清晰,如果你是新來的這些模式

注意:我並不完全是正規的,也許有人可以檢查我提供的模式。

+0

這個例子不支持多維數組。 –

+0

如果你像'['a'=> 1,'b'=> 2]'那樣存儲數組,那麼會發生什麼? –

+0

這個例子實際上不支持多維數組,如果其中一個值包含'[',它也會失敗。基於OP的問題,我不認爲這兩個限制是一個問題。 – user2693053

相關問題