2011-11-23 10 views
5

मैं 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 सरणी में कोई दिया गया आइटम मौजूद है और इसके लिए पथ लौटाता है। उदाहरण के लिए, यदि मैं id98 (सीडी-रोम) के साथ किसी उत्पाद की जांच करना चाहता हूं, तो फ़ंक्शन निम्न पथ लौटाता है: 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'); सीडी-रोम (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'); 30.

वहाँ ऐसा करने के लिए एक बेहतर तरीका है करने के लिए सीडी-रोम के लिए कीमत निर्धारित कर देगा के लिए मूल्य वापसी करना चाहिए?

धन्यवाद।

+1

eval बुराई है !!! –

उत्तर

10

यहाँ आप एक कोड मैं कुछ finetuned है जाना समय पहले:

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

बताएं ... लेकिन यदि आप शून्य कुंजी का भी उपयोग करते हैं, तो आपको बेहतर ढंग से '($ key = array_shift ($ path)) का उपयोग करना चाहिए! == null' बदले –

+0

धन्यवाद, ऐसा लगता है कि यह मेरे लिए काम करेगा। – casper

+0

@ कैस्पर: सहायक होने में खुशी हुई –

3

कल लोगों ने मुझे वोट दिया क्योंकि मुझे यह कार्य मिला। और आज मुझे उम्मीद है कि कोई इसका इस्तेमाल कर सकता है।

हो रही मूल्यों

समारोह नीचे पथ आपके द्वारा निर्धारित की मान प्रदान करेंगे।

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

धन्यवाद, मुझे विचार आया। मैं इसे आजमाऊंगा। – casper

+0

मैंने पहले से ही इसका परीक्षण किया है, इसलिए यह काम करना चाहिए, अगर नहीं, तो मुझे – Niels

संबंधित मुद्दे