2012-04-16 17 views
5

में एक बहुआयामी सरणी अपडेट कर रहा है मैं एक सरणी है कि इसपीएचपी

$array = 
    Array 
    (
    [0] => Array 
     (
      [Product] => Amazing Widget 
      [Value] => 200 
     ) 

    [1] => Array 
     (
      [Product] => Super Amazing Widget 
      [Value] => 400 
     ) 

    [2] => Array 
     (
      [Product] => Promising Widget 
      [Value] => 300 
     ) 

    [3] => Array 
     (
      [Product] => Superb Widget 
      [Value] => 400 
     ) 
    } 

मैं सरणी आदेश है कि "होनहार विजेट" बदलने के लिए करने के लिए 800 के बजाय 300

नोट को अपडेट करना चाहते की तरह लग रहा है इस सरणी का मनमाना है, जिसका अर्थ है कि मुझे "उत्पाद" नाम मान (आधार पर इसके नंबर पर नहीं) के आधार पर मूल्य को अपडेट करने की आवश्यकता है।

मैं इसे सरणी में संख्या के माध्यम से एक्सेस करने का प्रयास कर रहा था लेकिन महसूस किया कि उस कारण से काम नहीं करेगा और मुझे यकीन नहीं है कि किसी अन्य के आधार पर एक बहुआयामी सरणी के एक तत्व के मूल्य को कैसे बदला जाए।

किसी भी मदद के लिए धन्यवाद।

+0

इसे आजमाएं और वांछित उत्पाद की खोज करें और इसकी कुंजी को सहेजें। फिर उस कुंजी से जुड़े मान को बदलें? – WordsWorth

+1

क्या आप इस सरणी को उत्पन्न कर रहे हैं, क्या आप संरचना बदल सकते हैं? – Alex

+1

जैसा कि @ एलेक्स ने नोट किया है, उत्पाद नाम होने की कुंजी के साथ हैश का उपयोग करना बेहतर हो सकता है। प्रत्येक प्रविष्टि गुणों का एक हैश होगा। –

उत्तर

5

मुझे लगता है कि आप पाश करने के लिए उन के माध्यम से की तरह कुछ होगा,:

foreach ($array as $k => $v) { 
    if ($v['Product']=='Promising Widget') { 
    $array[$k]['Value']=800; 
    } 
} 
17
foreach($array as &$value){ 
    if($value['Product'] === 'Promising Widget'){ 
     $value['Value'] = 800; 
     break; // Stop the loop after we've found the item 
    } 
} 

तो, आप सरणी के माध्यम से पाश, मूल्य आप चाहते हैं, तो यह बदल जाते हैं। &$value है इसलिए सरणी संदर्भ द्वारा पारित किया गया है। मतलब हम $array[$key]['Value'] करने के बिना, लूप से सरणी में सीधे मानों को संपादित कर सकते हैं।

+0

मुझे इसे मारो, सटीक कोड: o –

+0

आपको 'अनसेट ($ मान) जोड़ना चाहिए; अंत में, पहले बड़े लाल ** चेतावनी ** को देखें [foreach, मैन्युअल] (http: // php .net/manual/en/control-structures.foreach.php) –

1

इस उत्तर बहुत देर हो चुकी हो सकता है, लेकिन मैं एक इसी तरह के मुद्दों जो मैं इस समारोह

function r_search_and_replace(&$arr) { 
    foreach ($arr as $idx => $_) { 
     if(is_array($_)) r_search_and_replace($arr[$idx]); 
     else { 
      if(is_string($_)) $arr[$idx] = str_replace("PATTERN", "REPLACEMENT", $_); 
     } 
    } 
} 
4

मुझे लगता है कि सबसे सार्वभौमिक दृष्टिकोण है कि जैसे array_walk_recursive समारोह का उपयोग करने के लिए है का उपयोग कर हल सामना करना पड़ा:

array_walk_recursive($array, 'updateValue'); 

function updateValue(&$data, $key) { 
    if($key == 'Promising Widget') { 
    $data = 800; 
    } 
} 

इस तरह से अगर आप इस फ़ंक्शन पर बाद में अपना सरणी बदल देंगे तो भी ठीक काम करेगा।

+0

निश्चित रूप से 'सबसे सार्वभौमिक दृष्टिकोण' नहीं है। मैन्युअल पृष्ठ से: 'कोई भी कुंजी जो सरणी रखती है उसे फ़ंक्शन में पास नहीं किया जाएगा। ' – CapelliC