【问题标题】:functions to get/set values in multidimensional arrays dynamically动态获取/设置多维数组中的值的函数
【发布时间】:2012-01-04 20:22:02
【问题描述】:

我正在尝试用 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。

有没有更好的方法来做到这一点?

谢谢。

【问题讨论】:

    标签: php function multidimensional-array


    【解决方案1】:

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

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

    【讨论】:

    • ...但是如果您也使用零键,则最好使用($key=array_shift($path))!==null 代替
    【解决方案2】:

    昨天人们对我投了反对票,因为我得到了这个功能。而今天我希望有人可以使用它。

    获取价值

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

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

    【讨论】:

    • 谢谢,我明白了。我试试看。
    • 我已经对此进行了测试,所以它应该可以工作,如果没有,请告诉我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2022-11-11
    • 2017-11-16
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多