繁体   English   中英

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

[英]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_encodeserialize ,当需要从数据库中检索数据时,可以使用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"

另一种方式

正则表达式:

您可以尝试使用regexp,但这不是最好的方法,因为有时处理数据的速度太慢,而且也许,如果您不了解安全方面,那么绝对不是最佳方法。

分词器:

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

了解有关功能的更多信息:

优点:

  1. 支持多种数据类型:多维arrayobjectintegerfloatstring以及除resource以外的更多数据。
  2. 自PHP4以来,本机支持serialize和反unserialize
  3. 自PHP 5.2.0起对json_encodejson_decode机支持
  4. 快速,安全的编码和解码。

根据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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM