动态获取/设置多维数组中的值的函数


functions to get/set values in multidimensional arrays dynamically

我试图在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数组中,并返回它的路径。例如,如果我想检查id 98 (CD-Rom)的产品,该函数返回以下路径:1:extras:1

如果我想在数组中获取或设置一个值,我不知道如何使用路径。是否有可能构造数组键的路径,而不使用eval() ?我有这些功能:

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

So, $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。

有更好的方法吗?

谢谢。

这是我前一段时间微调过的代码:

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

昨天人们投票给我,因为我得到了这个函数。今天我希望有人可以使用它。

获得值

下面的函数将返回你定义的路径的值。

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