如何从PHP中的序列化字符串中获取数组?

时间:2016-01-16 12:40:49

标签: php

作为WordPress选项的结果我得到了以下详细信息作为结果。我不知道如何从下面的代码中获得有意义的结果(数组)。这可以用字符串解析吗?

a:6:{s:14:"street_address";s:9:"Add_line1";s:15:"street_address2";s:10:"Add_line_2";s:9:"city_name";s:5:"cityname";s:5:"state";s:7:"statename";s:3:"zip";s:6:"999999";s:14:"country_select";s:2:"IN";}

1 个答案:

答案 0 :(得分:1)

通常您只需使用unserialize()功能。

$result = unserialize($your_serialized_string);

但是,在seralized字符串中存在错误,因此函数返回false并且日志中出现错误。

PHP Notice:  unserialize(): Error at offset 110 of 198 bytes in [...]

当我在不使用函数unserialize()serialize()的情况下直接修改存储在数据库中的字符串时,我遇到了这个问题,因为序列化函数在数组的前面添加了值的长度& #39; s:14:" street_address"',其中14是' street_address'的长度,因此直接编辑您必须编辑您编辑的字符串的长度值。

您发布的序列化字符串有两个错误的值。

我用以下代码解决了这个问题,它自动在字符串中重新生成错误的长度值:

<?php 
@$result = unserialize($your_serialized_string);
if(!$result){
    // UNSERIALIZE OFFSET ERROR
    $result_temp = preg_replace_callback('!s:(\d+):"(.*?)";!', 
    function($match){
        return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
    },
    $your_serialized_string);
    $result = unserialize($result_temp);
}
var_dump($result);
echo $result['street_address'];
?>

然后您可以使用关联数组语法

访问数组
$result['street_address']

或喜欢对象

$result = (object) $result;
$result->street_address