2011-11-23 76 views
5

我想在php中編寫購物車,並且在多維數組中獲取/設置值有問題。 我保留當前訂單$_SESSION['basket']。它看起來像這樣:函數動態獲取/設置多維數組中的值

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

         ) 

       ) 
) 

每個項目都存儲爲一個子陣列。我有一個函數,它檢查basket數組中是否存在給定的項目,並返回它的路徑。例如,如果我想檢查產品是否帶有id98(CD-Rom),則該函數將返回以下路徑:1:extras:1

我無法弄清楚如何使用路徑,如果我想獲得或設置一個值在數組中。是否有可能構建數組鍵的路徑,而不使用eval()?我有這些功能:

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

所以,$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');會爲CD-ROM的價格設定爲30

是否有這樣做的更好的辦法?

謝謝。

+1

的eval是邪惡的! –

回答

10

在這裏你走我已經微調,一些代碼前段時間:

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

看到這個測試例子,我相信這是你在找什麼:

$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

...但如果你也使用零鍵,你應該更好地使用'($ key = array_shift($ path))!== null'而不是 –

+0

謝謝,它似乎會適用於我。 – casper

+0

@casper:很高興有幫助 –

3

昨天人們投了我票,因爲我得到了這個功能。今天我希望有人可以使用它。

獲取值

以下函數將返回定義路徑的價值。

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

呼應的

12 

和設定值

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

結果:

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

謝謝,我明白了。我會試試看。 – casper

+0

我已經測試了這個,所以它應該工作,如果沒有,只是讓我知道 – Niels