动态获取/设置多维数组中的值的函数
Posted
技术标签:
【中文标题】动态获取/设置多维数组中的值的函数【英文标题】: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
数组中是否存在给定项目并返回它的路径。例如,如果我要检查带有id
98
(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】:这里是我前段时间微调的代码:
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 ) ) ) ) )
【讨论】:
谢谢,我明白了。我试试看。 我已经对此进行了测试,所以它应该可以工作,如果没有,请告诉我以上是关于动态获取/设置多维数组中的值的函数的主要内容,如果未能解决你的问题,请参考以下文章