2011-11-23 16 views
5

Estoy tratando de escribir un carrito de compras en php y tengo un problema con los valores get/set en matrices multidimensionales. Guardo el pedido actual en $_SESSION['basket']. Parece que:funciones para obtener/establecer valores en matrices multidimensionales dinámicamente

[basket] => Array 
     (
      [0] => Array 
       (
        [pid] => 3 
        [name] => Camera 
        [price] => 200.99 
        [quantity] => 1 

       ) 

      [1] => Array 
       (
        [pid] => 5 
        [name] => Computer 
        [price] => 320.99 
        [quantity] => 1 

        [extras] => Array 
         (
          [0] => Array 
           (
            [pid] => 86 
            [name] => RAM 
            [price] => 99 
            [qty] => 1 
           ) 

          [1] => Array 
           (
            [pid] => 98 
            [name] => CD-ROM 
            [price] => 19.99 
            [qty] => 1 
           ) 

         ) 

       ) 
) 

Cada elemento se almacena como un subcampo. Tengo una función que comprueba si existe un elemento determinado en la matriz basket y le devuelve la ruta. Por ejemplo, si deseo verificar un producto con id98 (CD-Rom), la función devuelve la siguiente ruta: 1:extras:1.

No puedo encontrar la manera de usar la ruta si quiero obtener un valor en la matriz. ¿Es posible construir la ruta a una clave de matriz, sin el uso de eval()? Tengo estas funciones:

function get_val($array, $path, $key) { 
    //some code 
    return eval('return '.$array.$path.$key.';'); 
} 

Así, $price = get_val($_SESSION['basket'], $path, 'price'); debe devolver el precio de CD-ROM (19,99)

function set_val($array, $path, $key, $value) { 
    //some code 
    $str = eval(''.$array.$path.$key.';'); 
    $str = $value; 
} 

set_val($_SESSION['basket'], $path, 'price', '30'); fijará el precio de CD-ROM a 30.

¿Hay una mejor manera de hacer esto?

Gracias.

+1

eval es malo !!! –

Respuesta

10

Aquí tiene un código que he afinarse algunos Hace tiempo:

function get_val($array,$path) { 
    for($i=$array; $key=array_shift($path); $i=$i[$key]) { 
     if(!isset($i[$key])) return null; 
    } 
    return $i; 
    } 

    function set_val(&$array,$path,$val) { 
    for($i=&$array; $key=array_shift($path); $i=&$i[$key]) { 
     if(!isset($i[$key])) $i[$key] = array(); 
    } 
    $i = $val; 
    } 

ver este ejemplo de prueba, creo que es lo que busca:

$data = array("x"=>array("y"=>array("z"=>"foo"))); 
    echo get_val($data,array("x","y","z")); // foo 
    set_val($data,array("x","y","u"),"bar"); // $data["x"]["y"]["u"] = "bar"; 
+1

... pero si también usas cero teclas, mejor deberías usar '($ key = array_shift ($ path))! == null' en su lugar –

+0

Gracias, parece que va a funcionar para mí. – casper

+0

@casper: me alegro de ser útil –

3

Ayer la gente me votó porque obtuve esta función. Y hoy espero que alguien pueda usarlo.

valores Obtención

Debajo función devolverá el valor de la ruta que defina.

function getPath($path, $array) 
{ 
    $path = split(":", $path); 
    $active = $array; 
    foreach($path as $key => $part) 
    { 
     $active = $active[$part]; 
    } 
    return $active; 
} 

$array = array(array(array(array("product" => array("id" => 12))))); 

// Give the path to the data you want, by keys 
echo getPath("0:0:0:product:id", $array); 

Qué configuración

12 

Y de eco valora

function setPath($path, &$array, $mykey, $value) 
{ 
    $path = split(":", $path); 
    $active =& $array; 
    foreach($path as $key => $part) 
    { 
     $active =& $active[$part]; 
    } 
    $active[$mykey] = $value; 

    return $active; 
} 

$array = array(array(array(array("product" => array("id" => 12))))); 

// Give the path to the data you want, by keys 
setPath("0:0:0:product", $array, "price", 100); 
print_r($array); 

Resultados:

Array ([0] => Array ([0] => Array ([0] => Array ([product] => Array ([id] => 12 [price] => 100))))) 
+0

Gracias, entendí la idea. Lo intentaré. – casper

+0

Ya he probado esto, por lo que debería estar funcionando, si no, házmelo saber – Niels

Cuestiones relacionadas