Как я могу десериализовать строку? - PullRequest
2 голосов
/ 24 августа 2009

У меня есть система меню, которая использует древовидную структуру перетаскивания, чтобы пользователь мог легко ее изменить. Когда 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 ]

5 голосов
/ 24 августа 2009

Вам следует изучить функции json_encode / json_decode в PHP, которые действительно упрощают взаимодействие с Javascript.

С вашим текущим форматом сериализации вы просто создаете головную боль для себя.

1 голос
/ 24 августа 2009

Если вы действительно хотите использовать этот формат, что-то вроде этого будет работать, но я думаю, что 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);
1 голос
/ 24 августа 2009

Как насчет сериализации (вместо вашей строки 1>2>3>>4#5#6>7) в форму JSON, например:

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

Затем вы можете отменить его сериализацию, используя json_decode в PHP.

1 голос
/ 24 августа 2009

Я думаю, что вы можете сначала разбить эту строку на «#», затем каждый результат разбиения будет разделен регулярным выражением на «число> число», поэтому «>>» там не будет, затем «число >> число» и т. Д. .
Надеюсь, это поможет.
Извините за мой английский.

1 голос
/ 24 августа 2009

РЕДАКТИРОВАТЬ: для людей, проголосовавших за это несколько месяцев после того, как его спросили, оригинальный формат этого вопроса не упоминал JSON или Javascript. Поэтому я ответил на PHP, так как ОП ответил в комментариях, которые он исправил сам после моего ответа, я оставил свой ответ для людей, попадающих на эту страницу, когда они ищут ответ PHP на этот вопрос, даже если этот вопрос не является ( сейчас) прямо отвечая на него.

Хмм ...

так:

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

// do whatever

$var_name2 = unserialize($var_name);

Это хороший метод для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...