【问题标题】:PHP unserialize variablePHP反序列化变量
【发布时间】:2018-11-08 15:57:44
【问题描述】:

大家下午好,

是否有任何简单的方法来反序列化该类型的数据并将每个人都放入 Array()

$variable= "'Body Style'=>'SEDAN 4 DOOR';'CD Player'=>'PRESENT';'Color'=>'GRAY';'Engine Size'=>'3.0L V6 FI  F';'Air Bags'=>'4';'Radio'=>'PRESENT';'Tape Deck'=>'N/A';'Estimated Repair Cost'=>'5518';'ACV'=>'6122';'Driver Airbag'=>'INTACT';'Passenger Airbag'=>'INTACT';'Left Side Airbag'=>'INTACT';'Right Side Airbag'=>'INTACT';'VIN Status'=>'OK';'Interior Color'=>'GRAY';'Airbag'=>'INTACT';'KeyFob'=>'PRESENT';";

不使用explode()foreach()preg_match 函数?

谢谢你的回答。

【问题讨论】:

  • 您是否有理由不能使用这些特定功能?
  • 我绝不赞同这一点:$json = '{' . str_replace(["'", '=>', ';'], ['"', ':', ','], rtrim($variable, ';') ) . '}';

标签: php serialization


【解决方案1】:

是否有任何简单的方法来反序列化该类型的数据并将每个人都放入 Array() 不使用explode()、foreach() 和preg_match 函数?

是的,您可以使用preg_match_all()

if (preg_match_all("/'(.*?)'=>'(.*?)';/", $variable, $matches)) {
    $result = array_combine($matches[1], $matches[2]);
    print_r($result);
}

输出:

Array
(
    [Body Style] => SEDAN 4 DOOR
    [CD Player] => PRESENT
    [Color] => GRAY
    [Engine Size] => 3.0L V6 FI  F
    [Air Bags] => 4
    [Radio] => PRESENT
    [Tape Deck] => N/A
    [Estimated Repair Cost] => 5518
    [ACV] => 6122
    [Driver Airbag] => INTACT
    [Passenger Airbag] => INTACT
    [Left Side Airbag] => INTACT
    [Right Side Airbag] => INTACT
    [VIN Status] => OK
    [Interior Color] => GRAY
    [Airbag] => INTACT
    [KeyFob] => PRESENT
)

这种方法的优点是即使任何键或值包含分号(例如 Body;StyleSEDAN;4 DOOR)也能正常工作,这会使 explode() 方法失败。

https://3v4l.org/YuuZM

【讨论】:

    【解决方案2】:

    您可以使用eval$variable 的内容作为数组分配给另一个变量,如下所示:

    $variable= "'Body Style'=>'SEDAN 4 DOOR';'CD Player'=>'PRESENT';'Color'=>'GRAY';'Engine Size'=>'3.0L V6 FI  F';'Air Bags'=>'4';'Radio'=>'PRESENT';'Tape Deck'=>'N/A';'Estimated Repair Cost'=>'5518';'ACV'=>'6122';'Driver Airbag'=>'INTACT';'Passenger Airbag'=>'INTACT';'Left Side Airbag'=>'INTACT';'Right Side Airbag'=>'INTACT';'VIN Status'=>'OK';'Interior Color'=>'GRAY';'Airbag'=>'INTACT';'KeyFob'=>'PRESENT';";
    $variable = str_replace(';', ',', $variable);
    eval("\$array = [$variable];");
    print_r($array);
    

    但是,我们不鼓励使用eval。见这里:http://php.net/manual/en/function.eval.php

    我假设您是从其他地方获取$variable 的内容。例如,您有这种格式的数据而不是 json 格式的数据有什么特别的原因吗?

    编辑:我刚刚意识到代码不会按原样工作,因为数组的值是用分号而不是冒号分隔的。您需要先用冒号替换分号。我已经更新了代码以反映这一点。

    【讨论】:

    • 我认为他希望将字符串解析为键值对中包含多个元素的数组。这只是将整个字符串放入一个键中。您不需要 eval 。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2012-06-19
    • 2012-10-31
    • 2011-05-13
    • 2011-02-02
    相关资源
    最近更新 更多