如何将包含数组值的字符串转换为PHP数组?

时间:2016-11-24 12:27:00

标签: javascript php jquery arrays curl

我有一个包含如下数组的字符串:

$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数组?

2 个答案:

答案 0 :(得分:0)

如果您想在您的数据库上存储php数组,可以尝试使用json_encodeserialize,当您需要从数据库中获取反向数据时,可以使用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)

另一种方式

正则表达式:

你可以尝试使用正则表达式,但这不是最好的方法,因为有时候处理数据太慢了,也许,如果你不了解安全方面,这绝对不是最好的方法。

标记生成器:

您可以尝试创建自己的令牌处理器,如模板引擎,但这是最大的方式...

详细了解这些功能:

<强>优点:

  1. 支持多种数据类型:multidimentional $row['name'] // return "Jack" arrayobjectintegerfloat以及除string以外的更多数据。
  2. 自PHP4以来对resourceserialize的原生支持。
  3. 自PHP 5.2.0以来对unserializejson_encode的原生支持
  4. 快速安全的编码和解码。

答案 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,也许有人可以查看我提供的模式。