2011-05-25 12 views
8

Ok, así que tiene una matriz que contiene los siguientes elementos:PHP: Establecer el valor de un elemento de matriz asociativa multidimensional usando una trayectoria definida en una matriz separada

$array['a']['b'][0]['c']; 
$array['a']['b'][1]['c']; 
$array['a']['d'][0]['c']['c']; 
$array['b']['c']; 

Luego, en una matriz separada, he definido la ruta de acceso a estos valores:

$structure[0] = array('a','b','#','c'); 
$structure[1] = array('a','d','#','c','c'); 
$structure[2] = array('b','c'); 

último, tengo una matriz que tiene los valores:

$values[0] = array('value0-0','value0-1'); 
$values[1] = array('value1-0'); 
$values[2] = array('value2-0'); 

Estoy tratando de encontrar una función/bucle simple que pueda aplicar los valores en $ valores a la ruta de la matriz de $ array que se define en $ structure.

El resultado final sería:

$array['a']['b'][0]['c']='value0-0'; 
$array['a']['b'][1]['c']='value0-1'; 
$array['a']['d'][0]['c']['c']='value1-0'; 
$array['b']['c']='value2-0'; 

En el caso de $ valores [0] o valores $ [1], que serían capaces de bucle a través de cada valor y sustituir el $ estructura elemento coincidente ' # 'con el número de iteración para ese valor en particular $.

¿Se trata simplemente de un nudillo y escribir una función recursiva prolongada, o hay una construcción inteligente o una función php que podría proporcionar una solución más elegante?

Solución:

Gracias a Mario, mi solución final es:

foreach ($struct as $i=>$keys) 
    foreach ($values[$i] as $val) { 
    $r = & $array; 

    foreach ($keys as $key) { 

     if ($key == "#") { $key = $i; } 

     $r = & $r[$key]; // move pointer to subarray 
    } 

    $r = $val; 
    } 
} 
+0

Creo que se van a necesitar escribir algunos bucles. –

Respuesta

5

Usted tendrá que trabajar con referencias a atravesar la matriz de destino:

function inject($array, $struct, $values) { 

    foreach ($struct as $i=>$keys) 
    foreach ($values[$i] as $val) { 
     $r = & $array; 

     foreach ($keys as $key) { 

      if ($key == "#") { $key = count($r); } 

      settype($r[$key], "array"); 
      $r = & $r[$key]; // move pointer to subarray 
     } 

     $r = $val; 
    } 
+0

¡Muchas gracias! No entiendo la necesidad de 'settype()' sin embargo, no lo he usado y no parece ser necesario. He publicado mi solución final en mi pregunta. – DanH

+0

@DanH: el 'settype' evita tener que probar la existencia de los subarrays. Puede ser redundante en su caso, si la matriz objetivo ya contiene la estructura corrent (vacía). Y ahora que lo pienso, '& $ r [$ key]' en realidad creará subarreglos faltantes. Por lo tanto, el encasillado 'settype' no es necesario. – mario

Cuestiones relacionadas