2011-09-22 19 views
6

मैं इस तरह एक स्ट्रिंग है , 2, 5 आदिगतिशील सरणी कुंजी

मैं एक बहुआयामी सरणी के लिए एक निश्चित मान कैसे आवंटित कर सकता हूं, लेकिन $keys का उपयोग करें I जहां स्थिति डालने की स्थिति की पहचान करने के लिए ओवे?

तरह:

$arr['one']['two']['three']['four'] = 'value';

क्षमा करता है, तो सवाल भ्रामक है, लेकिन मैं नहीं जानता कि कैसे समझाने के लिए यह बेहतर

उत्तर

13

यह गैर तुच्छ की तरह है, क्योंकि आप घोंसला करना चाहते हैं, लेकिन इसे कुछ ऐसा होना चाहिए:

function insert_using_keys($arr, $keys, $value){ 
    // we're modifying a copy of $arr, but here 
    // we obtain a reference to it. we move the 
    // reference in order to set the values. 
    $a = &$arr; 

    while(count($keys) > 0){ 
     // get next first key 
     $k = array_shift($keys); 

     // if $a isn't an array already, make it one 
     if(!is_array($a)){ 
      $a = array(); 
     } 

     // move the reference deeper 
     $a = &$a[$k]; 
    } 
    $a = $value; 

    // return a copy of $arr with the value set 
    return $arr; 
} 
1

आपको पहले यह सुनिश्चित करना होगा कि कुंजी मौजूद है, फिर मान असाइन करें। कुछ इस तरह (untested) काम करना चाहिए:

function addValueByNestedKey(&$array, $keys, $value) { 
    $branch = &$array; 
    $key = array_shift($keys); 
    // add keys, maintaining reference to latest branch: 
    while(count($keys)) { 
     $key = array_pop($keys); 
     if(!array_key_exists($key, $branch) { 
      $branch[$key] = array(); 
     } 
     $branch = &$branch[$key]; 
    } 
    $branch[$key] = $value; 
} 

// usage: 
$arr = array(); 
$keys = explode('/', 'one/two/three/four'); 

addValueByNestedKey($arr, $keys, 'value'); 
1

यह सुनने में अजीब है, लेकिन:

function setValueByArrayKeys($array_keys, &$multi, $value) { 
    $m = &$multi 
    foreach ($array_keys as $k){ 
     $m = &$m[$k]; 
    } 
    $m = $value; 
} 
+0

यह काम नहीं करेगा। '$ multi = $ multi [$ k]' एक * प्रतिलिपि बनाता है *, यह संदर्भ नहीं है, इसलिए जब आप अंतिम सरणी को छोड़कर '$ multi = $ value' करते हैं तो आप वास्तव में कुछ भी संशोधित नहीं कर रहे हैं। –

+0

बस इसे संपादित किया गया। – MattoTodd

+0

यह * अभी भी * काम नहीं करेगा, आप * प्रतियां * बना रहे हैं, नहीं * संदर्भ *। –

5
$string = 'one/two/three/four'; 
$keys = explode('/', $string); 
$arr = array(); // some big array with lots of dimensions 
$ref = &$arr; 

while ($key = array_shift($keys)) { 
    $ref = &$ref[$key]; 
} 

$ref = 'value'; 

यह क्या कर रही है:

  • ट्रैक रखने के लिए एक चर, $ref, का उपयोग करते हुए $arr के वर्तमान आयाम के संदर्भ में।
  • एक समय में $keys के माध्यम से लूपिंग, वर्तमान संदर्भ के $key तत्व का संदर्भ।
  • मूल्य को अंतिम संदर्भ में सेट करना।
+0

मुझे यह कोशिश करते समय "सर्वर द्वारा कनेक्शन बंद" मिलता है :) – Alex

+0

ठीक है अब यह काम करता है: डी – Alex

+0

क्या होगा यदि '$ कुंजी' में 0 या न्यूल है? –

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