Я пытаюсь написать корзину покупок в 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 ) ) ) ) )