[英]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.