[英]How to convert a string containing an array value to a PHP array?
我有一個包含如下數組的字符串:
$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數組?
如果要在數據庫上存儲一個php數組,可以嘗試使用json_encode
或serialize
,當需要從數據庫中檢索數據時,可以使用json_decode
或unserialize
。
使用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"
另一種方式
正則表達式:
您可以嘗試使用regexp,但這不是最好的方法,因為有時處理數據的速度太慢,而且也許,如果您不了解安全方面,那么絕對不是最佳方法。
分詞器:
您可以嘗試創建自己的令牌處理器,例如模板引擎,但這是最大的方法...
了解有關功能的更多信息:
優點:
array
, object
, integer
, float
, string
以及除resource
以外的更多數據。 serialize
和反unserialize
。 json_encode
和json_decode
機支持 根據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);
我將這種模式放在regex101上,如果您不熟悉這些模式 ,那可能會使事情變得更清楚。
注意:我並不是RegEx專家,也許有人可以檢查我提供的模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.