我有一个包含如下数组的字符串:
$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数组?
答案 0 :(得分:0)
如果您想在您的数据库上存储php数组,可以尝试使用json_encode
或serialize
,当您需要从数据库中获取反向数据时,可以使用json_decode
或{ {1}}。
使用unserialize
示例(以json存储):
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) . '")'
);
使用$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)
示例(商店序列化): $ myArray = array(' name' =>' Jack',' lastname' =>' Smith',24); $ toStore = serialize($ myArray); //返回一个字符串:a:3:{s:4:" name&#34 ;; s:4:" Jack&#34 ;; s:8:" lastname&#34 ;; S:5:"史密斯&#34 ;; I:0; I:24;}
serialize
示例(检索序列化):
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"
,array
,
object
,integer
,float
以及除string
以外的更多数据。resource
和serialize
的原生支持。unserialize
和json_encode
的原生支持答案 1 :(得分: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上,如果您对这些模式不熟悉,那么可能会让事情变得更清楚。
注意:我不完全是RegEx-genious,也许有人可以查看我提供的模式。