2011-11-23 43 views
5

Tôi đang cố gắng viết một giỏ hàng trong php và tôi gặp vấn đề với các giá trị get/set trong các mảng đa chiều. Tôi giữ lệnh hiện tại trong $_SESSION['basket']. Có vẻ như:để nhận/đặt giá trị trong mảng đa chiều động

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

         ) 

       ) 
) 

Mọi mục được lưu trữ dưới dạng mạng con. Tôi có một hàm, kiểm tra xem một mục đã có tồn tại trong mảng basket và trả về đường dẫn đến nó hay không. Ví dụ: nếu tôi muốn kiểm tra sản phẩm có id98 (CD-Rom), hàm trả về đường dẫn sau: 1:extras:1.

Tôi không thể tìm ra cách sử dụng đường dẫn nếu tôi muốn nhận hoặc đặt giá trị trong mảng. Có thể xây dựng đường dẫn đến một khóa mảng không, không sử dụng eval()? Tôi có các chức năng sau:

function get_val($array, $path, $key) { 
    //some code 
    return eval('return '.$array.$path.$key.';'); 
} 

Vì vậy, $price = get_val($_SESSION['basket'], $path, 'price'); phải trả lại giá cho đĩa 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'); sẽ đặt giá cho CD-ROM đến 30.

Có cách nào tốt hơn để làm điều này?

Cảm ơn bạn.

+1

eval là ác !!! –

Trả lời

10

Ở đây bạn đi một đoạn code tôi đã finetuned số thời gian trước đây:

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

Xem ví dụ thử nghiệm này, tôi tin rằng nó là những gì bạn đang tìm kiếm:

$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"; 
+1

... nhưng nếu bạn sử dụng cũng không phím, bạn nên sử dụng tốt hơn '($ key = array_shift ($ path))! == null' thay vì –

+0

Cảm ơn, có vẻ như nó sẽ làm việc cho tôi. – casper

+0

@casper: rất vui được hữu ích –

3

Hôm qua mọi người đã bỏ phiếu cho tôi vì tôi nhận được chức năng này. Và hôm nay tôi hy vọng ai đó có thể sử dụng nó.

Bắt giá trị

Dưới hàm sẽ trả về giá trị của con đường bạn xác định.

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

nào

12 

Và thiết lập tiếng vang của các giá trị

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

Kết quả:

Array ([0] => Array ([0] => Array ([0] => Array ([product] => Array ([id] => 12 [price] => 100))))) 
+0

Cảm ơn bạn, tôi đã có ý tưởng. Tôi sẽ thử nó. – casper

+0

Tôi đã thử nghiệm này, vì vậy nó sẽ được làm việc, nếu không, chỉ cần cho tôi biết – Niels

Các vấn đề liên quan