2009-08-24 3 views
2

J'ai un système de menu qui utilise une structure d'arbre glisser-déposer pour le rendre facile à modifier par un utilisateur. Lorsque le javascript sérialise la chaîne, il le fait de la manière suivante:Comment puis-je désérialiser une chaîne?

// 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 

Ce sera alors obtenir sérialisé:

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

Le problème est qu'il pourrait y avoir un nombre arbitraire de sous-niveaux , ce qui rend difficile la désérialisation. J'utilise PHP côté serveur pour le désérialiser, mais je ne sais pas quoi faire.

Toutes les suggestions sont les bienvenues, même pour la méthode de sérialisation, je vais juste pirater le code.

+2

Cette chaîne sérialisée ne semble pas correcte. Ne devrait-il pas être 1> 2> 3 >> 4 # 5 # 6> 7? – karim79

+0

Oui, il devrait, bon endroit – xenon

Répondre

5

Vous devriez vous pencher sur les fonctions de json_encode/json_decode en PHP, cela rend l'interaction avec Javascript vraiment facile. Avec votre format de sérialisation actuel, vous ne faites que créer des maux de tête.

+0

Merci, j'étais un idiot. Maintenant je sais! – xenon

1

EDIT: pour les personnes qui ont voté en bas des mois après que cela a été demandé, le format original de cette question N'A PAS mentionné json ou javascript. J'ai donc répondu en PHP, comme l'OP a répondu dans les commentaires qu'il a corrigé après ma réponse, j'ai laissé ma réponse pour les personnes arrivant à cette page quand ils cherchent la réponse PHP pour cette question même si cette question ne l'est pas (maintenant) répondant directement.

hmm ...

donc:

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

// do whatever 

$var_name2 = unserialize($var_name); 

Serait-ce une bonne méthode pour vous d'utiliser?

+0

Désolé, mon erreur. Le menu est sérialisé par le javascript prêt à être envoyé côté serveur. – xenon

+1

Ah pas de problème, d'autres vont répondre alors que cette méthode est vraiment pour PHP. – Dorjan

1

Je pense que vous pouvez diviser cette chaîne d'abord par '#', puis chaque résultat divisé par regex à exactement "nombre> nombre" alors ">>" ne sera pas là, puis "nombre >> nombre" et ainsi sur.
J'espère que ça aide.
Désolé pour mon anglais.

1

Qu'en est-il de sérialisation (au lieu de votre chaîne 1>2>3>>4#5#6>7) en forme JSON comme ceci:

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

Ensuite, vous pouvez désérialisable en utilisant json_decode en PHP.

1

Si vous vouliez vraiment utiliser ce format, quelque chose comme ça fonctionnerait, mais je pense que JSON serait beaucoup mieux.

<?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); 
Questions connexes