2011-11-23 35 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