2011-12-16 11 views
7

Ho stringa:String con struttura a matrice di Array

Main.Sub.SubOfSub 

e un qualche tipo di dati, può essere una stringa:

SuperData 

Come posso trasformare tutto a questo array di cui sopra?

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

    ) 

)

Grazie per l'aiuto, PK

+0

$ tmp_array = explode ('.', $ Your_string); Quindi itera su $ tmp_array e crea il tuo array $ k – djot

+0

Dai un'occhiata a http://php.net/manual/en/function.explode.php e http://php.net/manual/en/function.implode .php e sei quasi a casa. – Cyclonecode

+0

Domanda simile, solo per un oggetto 'stdClass', non array: [Matrice su oggetto] (http://stackoverflow.com/q/11188563/367456). – hakre

risposta

11

Dati i valori

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

Ecco alcuni codice che ho in giro che fa quello che need¹:

$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; 

See it in action.

¹ In realtà fa leggermente più di questo: può essere incapsulato banalmente all'interno di una funzione, ed è configurabile su tutti e tre i valori di input (è possibile passare in un array con valori esistenti e lo espanderà se necessario) .

4

Come Jon ha suggerito (e chiedendo feedback per la chat), un alias di riferimento/variabile è utile qui per attraversare lo stack dinamico di chiavi. Quindi l'unica cosa necessaria è per iterare su tutte le sottochiavi e, infine, impostare il valore:

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

Il riferimento rende possibile l'uso di una pila al posto di ricorsione che è generalmente più magra. Inoltre, questo codice impedisce di sovrascrivere gli elementi esistenti nell'array $target. esempio completo:

$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); 

uscita:

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

Demo

Question (s) correlati:

Problemi correlati