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

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

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

Спасибо.

Ответы [ 2 ]

10 голосов
/ 23 ноября 2011

Вот вам код, который я настроил некоторое время назад:

  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";
3 голосов
/ 23 ноября 2011

Вчера люди проголосовали против меня, потому что я получил эту функцию. И сегодня я надеюсь, что кто-то может использовать его.

Получение значений

Функция ниже вернет значение заданного вами пути.

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 ) ) ) ) ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...