2011-11-03 33 views
5

Estoy tratando de crear una matriz al analizar una cadena separada con puntosCrea una matriz multidimensional dinámica

$string = "foo.bar.baz"; 
$value = 5 

a

$arr['foo']['bar']['baz'] = 5; 

I Analizada las teclas con

$keys = explode(".",$string); 

Cómo podría hacer esto?

+1

¿Hay siempre 3 llaves o cualquier número? – Toto

+0

Tiene que funcionar con cualquier número –

Respuesta

2

que puede hacer:

$keys = explode(".",$string); 
$last = array_pop($keys); 

$array = array(); 
$current = &$array; 

foreach($keys as $key) { 
    $current[$key] = array(); 
    $current = &$current[$key]; 
} 

$current[$last] = $value; 

DEMO

usted puede hacer fácilmente una función de si este, pasando la cadena y el valor como parámetro y devolver la matriz.

+0

bueno, por cierto, ¿por qué utilizó la referencia? – Dev

+0

¡Sí, esto funciona muy bien para mí! gracias –

+0

@dev: Porque una matriz se copia cuando la asigna a una variable. Si no usara referencias, no funcionaría. –

2

Puede probar siguiente solución:

function arrayByString($path, $value) { 
    $keys = array_reverse(explode(".",$path)); 

    foreach ($keys as $key) { 
    $value = array($key => $value); 
    } 

    return $value; 
} 

$result = arrayByString("foo.bar.baz", 5); 

/* 
array(1) { 
    ["foo"]=> 
    array(1) { 
    ["bar"]=> 
    array(1) { 
     ["baz"]=> 
     int(5) 
    } 
    } 
} 
*/ 
+0

Interesante acercamiento +1 –

0

Esto es de alguna manera relacionada con la cuestión se puede encontrar una respuesta a, aquí:

PHP One level deeper in array each loop made

sólo tendría que cambiar el código un poco:

$a = explode('.', "foo.bar.baz"); 
$b = array(); 
$c =& $b; 

foreach ($a as $k) { 
    $c[$k] = array(); 
    $c  =& $c[$k]; 
} 

$c = 5; 

print_r($b); 
Cuestiones relacionadas