2009-08-24 2 views
2

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

Любые предложения приветствуются, даже для метода сериализации, я просто взломаю код.

+2

Эта сериализованная строка выглядит неправильно. Разве это не должно быть 1> 2> 3 >> 4 # 5 # 6> 7? – karim79

+0

Да, должно быть, хорошее место – xenon

ответ

5

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

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

+0

Спасибо, я был таким идиотом. Теперь я знаю! – xenon

1

EDIT: для людей, голосовавших через несколько месяцев после его запроса, исходный формат этого вопроса НЕ упоминал 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); 

Будет ли это хороший способ для вас использовать?

+0

Извините, моя ошибка. Меню сериализуется javascript, готовым к отправке со стороны сервера. – xenon

+1

Ах, нет проблем, другие ответят тогда, поскольку этот метод действительно для PHP. – Dorjan

1

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

1

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

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

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

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); 
Смежные вопросы