我有一个菜单系统,它使用拖放树结构,方便用户修改。当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服务器端来反序列化它,但我不知道该怎么做。
欢迎任何建议,即使是序列化的方法,我也只是破解代码。
答案 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);