2011-11-23 11 views
5

php'de bir alışveriş sepeti yazmaya çalışıyorum ve çok boyutlu dizilerde get/set değerleriyle ilgili bir sorun yaşıyorum. Geçerli siparişi $_SESSION['basket']'da saklıyorum. Şöyle görünüyor:, dinamik olarak çok boyutlu dizilerdeki değerleri almak/ayarlamak için işlevler

[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 
           ) 

         ) 

       ) 
) 

Her öğe bir alt öğe olarak saklanır. Verilen bir öğenin basket dizisinde var olup olmadığını denetleyen ve ona yolunu döndüren bir işlevim var. Örneğin, bir ürünün id98 (CD-Rom) ile kontrol edilmesini istiyorsanız, işlev şu yolu döndürür: 1:extras:1.

Dizide olsun veya almak istediğinizde yolu nasıl kullanacağımı anlayamıyorum. eval() kullanımı olmadan bir dizi anahtar yolunu oluşturmak mümkün mü? Ben bu işlevleri vardır:

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

Yani, $price = get_val($_SESSION['basket'], $path, 'price'); 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'); 30.

Bunu yapmak için daha iyi bir yolu var mı için CD-ROM fiyatını belirleyecektir fiyatını dönmelidir?

Teşekkür ederiz.

+1

eval kötüdür !!! –

cevap

10

Eğer bazı Finetuned gelmiş bir kod gitmek önce süresi:

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; 
    } 

bu test örneğine bakın, ben aradığınız budur inanıyoruz:

$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

'u bildirin ... ama aynı zamanda sıfır anahtarlar kullanırsanız, daha iyi kullanmalısınız '($ key = array_shift ($ yol))! == null' yerine –

+0

Teşekkürler, benim için çalışacak gibi görünüyor. – casper

+0

@casper: Yardımsever olmaktan memnun oldum –

3

Dün insanlar oy kullandı çünkü bu işlevi aldım. Ve bugün birilerinin onu kullanabileceğini umuyorum.

alma değerleri fonksiyonu Aşağıda

tanımladığınız yolun değerini döndürecektir. echo

12 

Ve ayarı

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); 

Sonuçları değerleri

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); 

: Burada

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

Teşekkür ederim, fikrim var. Deneyeceğim. – casper

+0

Bunu zaten test ettim, bu yüzden çalışıyor olmalı, eğer olmasa bile, bana – Niels