2011-12-16 29 views
7

tengo cadena:cadena con estructura de matriz a matriz

Main.Sub.SubOfSub 

y algún tipo de datos, puede ser una cadena:

SuperData 

Cómo puede transformar todo a esta matriz de arriba?

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

    ) 

)

Gracias por la ayuda, PK

+0

$ tmp_array = explode ('.', $ Your_string); Luego itere a través de $ tmp_array y cree su array $ k – djot

+0

Eche un vistazo a http://php.net/manual/en/function.explode.php y http://php.net/manual/en/function.implode .php y estás casi en casa. – Cyclonecode

+0

Pregunta similar, solo para un objeto 'stdClass', no una matriz: [Matriz a objeto] (http://stackoverflow.com/q/11188563/367456). – hakre

Respuesta

11

Dados los valores

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

Aquí hay un código He ahí que hace lo que 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.

¹ En realidad, es un poco más que eso: se puede encapsular de forma trivial dentro de una función y se puede configurar en los tres valores de entrada (puede pasar una matriz con valores existentes y la ampliará según sea necesario) .

4

Como Jon sugirió (y al solicitar comentarios en el chat), un alias de referencia/variable es útil aquí para recorrer la pila dinámica de claves. Así que lo único que se necesita es iterar sobre todas las subclaves y, finalmente, establecer el valor:

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

La referencia hace que sea posible el uso de una pila en lugar de recursividad que es generalmente más delgado. Además, este código evita sobrescribir elementos existentes en la matriz $target. Ejemplo 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); 

Salida:

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

Demo

Pregunta (s) relacionada: