2011-11-24 25 views
6

En relación con esta pregunta que hice antes: Searching multi-dimensional array's keys using a another arrayEl establecimiento de un valor en una matriz multidimensional utilizando una matriz de claves

Me gustaría tener una manera de establecer un valor en una matriz multidimensional (hasta 6 niveles de profundidad), usando una matriz separada que contiene las claves para usar.

p. Ej.

$keys = Array ('A', 'A2', 'A22', 'A221'); 
$cats[A][A2][A22][A221] = $val; 

Intenté escribir un interruptor torpe con poco éxito ... ¿hay una solución mejor?

function set_catid(&$cats, $keys, $val) { 
    switch (count($keys)) { 
     case 1: $cats[$keys[0]]=$val; break; 
     case 2: $cats[$keys[0]][$keys[1]]=$val; break; 
     case 3: $cats[$keys[0]][$keys[1]][$keys[2]]=$val; break; 
     etc... 
    } 
} 
+0

Usted podría [Utilizar referencias] (http://stackoverflow.com/questions/6088115/transform-flat-array-into-a-hierarchical-multi-dimensional -array/6088147 # 6088147) para recorrer la matriz con cualquier cantidad de teclas. – mario

Respuesta

1

probar esto:

function set_catid(&$cats, $keys, $val) { 
    $ref =& $cats; 
    foreach ($keys as $key) { 
    if (!is_array($ref[$key])) { 
     $ref[$key] = array(); 
    } 
    $ref =& $ref[$key]; 
    } 
    $ref = $val; 
} 
+0

Esto funciona muy bien a menos que la clave final no exista, que en mi caso no será así. me sale el error "Error fatal: no se pueden crear referencias a/desde compensaciones de cadenas ni objetos sobrecargados" en $ ref = & $ ref [$ key]; ¿Cómo resolvería esto? –

+0

raro. Eso funciona bien para mi. (comenzando con una matriz totalmente vacía $ cats) ... debe ser porque "A22" (la clave anterior a la última clave) existe como algo diferente que no es una matriz. p.ej. ¿cuerda? en ese caso, reemplazar isset() con is_array() ayudará, pero perderá la cadena en "A22" reemplazándola por otra matriz. ¿Puede publicar la salida de print_r ($ cats) antes de usar esta función? – Kaii

+0

hice el cambio que sugerí en el ejemplo, intente nuevamente – Kaii

1
function insertValueByPath($array, $path, $value) { 
    $current = &$array; 
    foreach (explode('/', $path) as $part) { 
     $current = &$current[$part]; 
    } 
    $current = $value; 

    return $array; 
} 

$array = insertValueByPath($array, 'A/B/C', 'D'); 
// => $array['A']['B']['C'] = 'D'; 

Puede obviamente también utilizar una matriz de $path con sólo cortar la llamada explode.

0

Debe usar referencias.

En el foreach nos movemos más profundamente de la llave a la clave. Var $ temp es la referencia al elemento actual de la matriz $ cat. Al final, la temperatura es un elemento que necesitamos.

<?php 

    function set_catid(&$cats, $keys, $val) { 
     $temp = &$cats; 
     foreach($keys as $key) { 
      $temp = &$temp[$key]; 
     } 

     $temp = $val; 
    } 

    $cats = array(); 
    $keys = Array ('A', 'A2', 'A22', 'A221'); 
    set_catid($cats, $keys, 'test'); 
    print_r($cats); 
    ?> 
+0

Eso funciona muy bien a menos que la clave final no exista, que en mi caso no será así. entonces necesitaré agregar una nueva llave y un par de valores. ¿Como podría hacerlo? –

Cuestiones relacionadas