2011-09-22 25 views
6

Tengo una cadena como esta:teclas matriz dinámica

$string = 'one/two/three/four';

la que me convierto en una matriz:

$keys = explode('/', $string);

Esta matriz puede tener cualquier número de elementos, como 1 , 2, 5 etc.

¿Cómo puedo asignar un cierto valor a una matriz multidimensional, pero uso el $keys He creado ab ove para identificar la posición donde insertar?

igual:

$arr['one']['two']['three']['four'] = 'value';

Lo siento si la pregunta es confuso, pero no sé cómo explicarlo mejor

Respuesta

13

Esta es una especie de no-trivial, ya que desea anidar, pero debería ir algo así como:

function insert_using_keys($arr, $keys, $value){ 
    // we're modifying a copy of $arr, but here 
    // we obtain a reference to it. we move the 
    // reference in order to set the values. 
    $a = &$arr; 

    while(count($keys) > 0){ 
     // get next first key 
     $k = array_shift($keys); 

     // if $a isn't an array already, make it one 
     if(!is_array($a)){ 
      $a = array(); 
     } 

     // move the reference deeper 
     $a = &$a[$k]; 
    } 
    $a = $value; 

    // return a copy of $arr with the value set 
    return $arr; 
} 
1

Primero tendrá que asegurarse de que la clave exista, luego asigne el valor. Algo como esto debería funcionar (no probado):

function addValueByNestedKey(&$array, $keys, $value) { 
    $branch = &$array; 
    $key = array_shift($keys); 
    // add keys, maintaining reference to latest branch: 
    while(count($keys)) { 
     $key = array_pop($keys); 
     if(!array_key_exists($key, $branch) { 
      $branch[$key] = array(); 
     } 
     $branch = &$branch[$key]; 
    } 
    $branch[$key] = $value; 
} 

// usage: 
$arr = array(); 
$keys = explode('/', 'one/two/three/four'); 

addValueByNestedKey($arr, $keys, 'value'); 
1

es cursi, pero:

function setValueByArrayKeys($array_keys, &$multi, $value) { 
    $m = &$multi 
    foreach ($array_keys as $k){ 
     $m = &$m[$k]; 
    } 
    $m = $value; 
} 
+0

Esto no funcionará. '$ multi = $ multi [$ k]' crea una * copia *, no es una referencia, por lo que no está modificando nada cuando hace '$ multi = $ value', excepto la matriz final. –

+0

acaba de editarlo. – MattoTodd

+0

* todavía * no funcionará, está creando * copias *, no * referencias *. –

5
$string = 'one/two/three/four'; 
$keys = explode('/', $string); 
$arr = array(); // some big array with lots of dimensions 
$ref = &$arr; 

while ($key = array_shift($keys)) { 
    $ref = &$ref[$key]; 
} 

$ref = 'value'; 

Lo que esto está haciendo:

  • Usando una variable, $ref, para realizar un seguimiento de una referencia a la dimensión actual de $arr.
  • Looping a través de $keys uno a la vez, haciendo referencia al elemento $key de la referencia actual.
  • Configurando el valor a la referencia final.
+0

Obtengo una "conexión cerrada por el servidor" cuando intento esto :) – Alex

+0

ok ahora funciona: D – Alex

+0

¿Qué pasa si '$ keys' contiene 0 o NULL? –

Cuestiones relacionadas