2009-08-24 1 views
2

Ich habe ein Menüsystem, das eine Drag & Drop-Baumstruktur verwendet, um es einem Benutzer zu erleichtern, zu ändern. Wenn das Javascript, um die Zeichenfolge serialisiert, hat es in der folgenden Art und Weise:Wie kann ich einen String deserialisieren?

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

Dies wird dann serialisiert erhalten, wie:

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

Das Problem dabei ist, dass es könnte eine beliebige Anzahl von Unterebenen sein , was die Serialisierung erschwert. Ich verwende PHP-Server-Seite, um es zu entserialisieren, aber ich weiß nicht, was ich tun soll.

Alle Vorschläge begrüßen, auch auf die Methode der Serialisierung, ich werde nur den Code hacken.

+2

Diese serialisierte Zeichenfolge sieht nicht richtig aus. Sollte es nicht 1> 2> 3 >> 4 # 5 # 6> 7 sein? – karim79

+0

Ja, es sollte, gute Stelle – xenon

Antwort

5

Sie sollten in json_encode/json_decode Funktionen in PHP schauen, die die Interaktion mit Javascript wirklich einfach machen.

Mit Ihrem aktuellen Serialisierungsformat erstellen Sie nur Kopfschmerzen für sich.

+0

Danke, ich war so ein Idiot. Jetzt weiß ich! – xenon

1

EDIT: für die Leute, die diese Monate nach der Anfrage abstimmen, hat das ursprüngliche Format dieser Frage JSON oder Javascript nicht erwähnt. Deshalb habe ich in PHP geantwortet, wie das OP in den Kommentaren beantwortet hat, die er nach meiner Antwort korrigiert hat. Ich habe meine Antwort für Leute gelassen, die auf diese Seite kommen, wenn sie nach der PHP-Antwort für diese Frage suchen, obwohl diese Frage nicht jetzt) ​​direkt antworten.

hmm ...

so:

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

// do whatever 

$var_name2 = unserialize($var_name); 

Wäre das eine gute Methode für Sie zu benutzen?

+0

Sorry, mein Fehler. Das Menü wird von dem JavaScript serialisiert, das bereit ist, von der Serverseite gesendet zu werden. – xenon

+1

Ah kein Problem, andere werden dann antworten, da diese Methode wirklich für PHP ist. – Dorjan

1

Ich denke, Sie können diese Zeichenfolge zuerst durch "#" teilen, dann teilt sich jedes Split-Ergebnis durch Regex auf genau "Nummer> Nummer" so ">>" wird nicht da sein, dann "Nummer >> Nummer" und so auf.
Hoffe es hilft.
Sorry für mein Englisch.

1

Was ist (statt der Zeichenfolge 1>2>3>>4#5#6>7) in JSON Form wie folgt zu serialisiert:

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

Dann können Sie es json_decode in PHP unserialize.

1

Wenn Sie wirklich dieses Format verwenden wollten, würde so etwas funktionieren, aber ich denke JSON wäre viel besser.

<?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); 
Verwandte Themen