String mit Array-Struktur zu Array

Ich habe eine Schnur:

Main.Sub.SubOfSub 

Und eine Art von Daten, kann eine Zeichenfolge sein:

 SuperData 

Wie kann ich alles auf dieses Array oben umwandeln?

 Array ( [Main] => Array ( [Sub] => Array ( [SubOfSub] => SuperData ) ) 

)

Danke für die Hilfe, PK

   

Angesichts der Werte

 $key = "Main.Sub.SubOfSub"; $target = array(); $value = "SuperData"; 

Hier ist ein Code, den ich herumliegen habe, der das tut, was du brauchst¹:

 $path = explode('.', $key); $root = &$target; while(count($path) > 1) { $branch = array_shift($path); if (!isset($root[$branch])) { $root[$branch] = array(); } $root = &$root[$branch]; } $root[$path[0]] = $value; 

Sehen Sie es in Aktion .

¹ Tatsächlich ist es etwas mehr als das: es kann trivial in einer function gekapselt werden, und es ist konfigurierbar für alle drei Eingabewerte (Sie können ein Array mit vorhandenen Werten übergeben, und es wird bei Bedarf erweitert).

Wie Jon vorgeschlagen hat (und Feedback im Chat verlangt), ist hier ein Verweis / Variablen-Alias ​​hilfreich, um den dynamischen Stapel von Schlüsseln zu durchlaufen. Das einzige, was benötigt wird, ist, über alle Unterschlüssel zu iterieren und schließlich den Wert zu setzen:

 $rv = &$target; foreach(explode('.', $key) as $pk) { $rv = &$rv[$pk]; } $rv = $value; unset($rv); 

Die Referenz ermöglicht es, einen Stapel anstelle einer Rekursion zu verwenden, die im allgemeinen magerer ist. Außerdem verhindert dieser Code das Überschreiben vorhandener Elemente im $target Array. Vollständiges Beispiel:

 $key = "Main.Sub.SubOfSub"; $target = array('Main' => array('Sub2' => 'Test')); $value = "SuperData"; $rv = &$target; foreach(explode('.', $key) as $pk) { $rv = &$rv[$pk]; } $rv = $value; unset($rv); var_dump($target); 

Ausgabe:

 array(1) { ["Main"]=> array(2) { ["Sub2"]=> string(4) "Test" ["Sub"]=> array(1) { ["SubOfSub"]=> string(9) "SuperData" } } } 

Demo

Verwandte Frage (n):

  • Erweiterungen für dynamische Array-Schlüssel
  • Wie gruppiert man Elemente eines Arrays?