функции для получения / установки значений в многомерных массивах динамически

Я пытаюсь написать корзину покупок в php, и у меня есть проблема с get / set values ​​в многомерных массивах. Я сохраняю текущий порядок в $_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.

Есть ли лучший способ сделать это?

Спасибо.

Здесь вы читаете код, который я финализировал некоторое время назад:

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