如何反序列化字符串?

时间:2009-08-24 14:05:25

标签: php javascript jquery serialization

我有一个菜单系统,它使用拖放树结构,方便用户修改。当javascript序列化字符串时,它按以下方式执行:

// Assume each of these items has an ID on with the respective numbers attached
Menu Item 1
  + Menu Item 2
  + Menu Item 3
     + Menu Item 4
Menu Item 5
Menu Item 6
  + Menu Item 7

然后将序列化为:

1>2>3>>4#5#6>7

这个问题是可能存在任意数量的子级别,这使得很难反序列化。我正在使用PHP服务器端来反序列化它,但我不知道该怎么做。

欢迎任何建议,即使是序列化的方法,我也只是破解代码。

5 个答案:

答案 0 :(得分:5)

您应该在PHP中查看json_encode / json_decode函数,这些函数与Javascript的交互非常简单。

使用您当前的序列化格式,您只会为自己制造麻烦。

答案 1 :(得分:1)

编辑:对于在被问到这几个月后投票的人们,这个问题的原始格式不提及json或javascript。因此我在PHP中回答,因为OP在评论中回答他在我的回复后纠正了自己,当我们为这个问题搜索PHP答案时,我留下了我的答案,即使这个问题不是(现在)直接回答它。

嗯...

这样:

$var_name = serialize( array("Menu Item 1, Menu Item 2, Menu Item 3, etc...") );

// do whatever

$var_name2 = unserialize($var_name);

这会是一个很好的方法吗?

答案 2 :(得分:1)

我认为你可以先用'#'拆分这个字符串,然后每个拆分结果按正则表达式拆分为“number> number”所以“>>”不会在那里,然后是“数字>>数字”等等。
希望它有所帮助。
抱歉我的英语。

答案 3 :(得分:1)

如何将(而不是字符串1>2>3>>4#5#6>7)序列化为JSON格式如下:

{'1': {'2': {'3': {'4': true}}}, '5': true, '6': {'7': true}}

然后你可以在PHP中使用json_decode对它进行反序列化。

答案 4 :(得分:1)

如果你真的想使用这种格式,那么这样的东西就行了,但我认为JSON会好得多。

<?php

$str = '1>2>3>>4#5#6>7';

preg_match_all('~([^\d]+)?([\d]+)~', $str, $matches, PREG_SET_ORDER);

//$current is the nodes from the top to the node we are at currently
$current = array();
$result = array();

foreach ($matches as $item) {
    $id = $item[2];

    if (!$item[1] || $item[1] == '#') {
        $level = 0;   
    } else {
        $level = strlen($item[1]);    
    }

    $tmp = array( 'id' => $id );

    $current[ $level ] = & $tmp;

    if ($level == 0) {
        $result[] = & $tmp;   
    } elseif (isset($current[ $level - 1 ])) {
        $parent = & $current[ $level - 1 ];
        if (!isset($parent['children'])) {
            $parent['children'] = array();   
        }
        $parent['children'][] = & $tmp;
        unset($parent);
    } 

    unset($tmp);
}

print_r($result);