2011-11-24 2 views
6

संबंध में की एक सरणी का उपयोग कर: (Searching multi-dimensional array's keys using a another arrayएक बहु-आयामी सरणी में एक मूल्य सेट इस सवाल का मैं पहले से पूछा की चाबी

मैं एक बहु-आयामी सरणी में एक मूल्य निर्धारित करने के लिए एक तरह से करना चाहते हैं पर निर्भर 6 स्तर गहरे), उपयोग करने के लिए कुंजी युक्त एक अलग सरणी का उपयोग कर।

उदा।

$keys = Array ('A', 'A2', 'A22', 'A221'); 
$cats[A][A2][A22][A221] = $val; 

मैंने छोटी सफलता के साथ एक बेकार स्विच लिखने की कोशिश की ... क्या कोई बेहतर समाधान है?

function set_catid(&$cats, $keys, $val) { 
    switch (count($keys)) { 
     case 1: $cats[$keys[0]]=$val; break; 
     case 2: $cats[$keys[0]][$keys[1]]=$val; break; 
     case 3: $cats[$keys[0]][$keys[1]][$keys[2]]=$val; break; 
     etc... 
    } 
} 
+0

आप कर सकते थे [उपयोग संदर्भ] (http://stackoverflow.com/questions/6088115/transform-flat-array-into-a-hierarchical-multi-dimensional -एरे/6088147 # 6088147) किसी भी कुंजी से सरणी को पार करने के लिए। – mario

उत्तर

1

इस प्रयास करें:

function set_catid(&$cats, $keys, $val) { 
    $ref =& $cats; 
    foreach ($keys as $key) { 
    if (!is_array($ref[$key])) { 
     $ref[$key] = array(); 
    } 
    $ref =& $ref[$key]; 
    } 
    $ref = $val; 
} 
+0

यह तब तक बढ़िया काम करता है जब तक कि अंतिम कुंजी मौजूद न हो, जो मेरे मामले में नहीं होगा। मुझे त्रुटि मिलती है "घातक त्रुटि: $ ref = & $ ref [$ key] पर" स्ट्रिंग ऑफसेट्स और न ही ओवरलोडेड ऑब्जेक्ट्स के संदर्भ/संदर्भ नहीं बना सकते हैं; मैं इसे कैसे हल करूं? –

+0

अजीब। यह मेरे लिए अच्छा काम करता है। (एक पूरी तरह से खाली सरणी $ बिल्लियों से शुरू) .. होना चाहिए क्योंकि "ए 22" (अंतिम कुंजी से पहले की कुंजी) कुछ अलग है जो एक सरणी नहीं है। जैसे स्ट्रिंग? उस मामले में is_array() के साथ Isset() को प्रतिस्थापित करने में मदद मिलेगी - लेकिन आप इसे "ए 22" में स्ट्रिंग को किसी अन्य सरणी के साथ बदलकर खो देंगे .. क्या आप इस फ़ंक्शन का उपयोग करने से पहले print_r ($ बिल्लियों) के आउटपुट पोस्ट कर सकते हैं? – Kaii

+0

मैंने उदाहरण में सुझाए गए परिवर्तन को बनाया है, फिर से प्रयास करें – Kaii

1
function insertValueByPath($array, $path, $value) { 
    $current = &$array; 
    foreach (explode('/', $path) as $part) { 
     $current = &$current[$part]; 
    } 
    $current = $value; 

    return $array; 
} 

$array = insertValueByPath($array, 'A/B/C', 'D'); 
// => $array['A']['B']['C'] = 'D'; 

आप स्पष्ट रूप से भी एक सरणी $path के लिए सिर्फ explode कॉल छोड़ने के द्वारा उपयोग कर सकते हैं।

0

आपको संदर्भों का उपयोग करना चाहिए।

पूर्वानुमान में हम कुंजी से कुंजी तक गहराई से आगे बढ़ रहे हैं। Var $ temp सरणी $ बिल्ली के वर्तमान तत्व का संदर्भ है। अंत में अस्थायी तत्व है जिसे हमें चाहिए।

<?php 

    function set_catid(&$cats, $keys, $val) { 
     $temp = &$cats; 
     foreach($keys as $key) { 
      $temp = &$temp[$key]; 
     } 

     $temp = $val; 
    } 

    $cats = array(); 
    $keys = Array ('A', 'A2', 'A22', 'A221'); 
    set_catid($cats, $keys, 'test'); 
    print_r($cats); 
    ?> 
+0

यह तब तक बढ़िया काम करता है जब तक कि अंतिम कुंजी मौजूद न हो, जो मेरे मामले में नहीं होगा। तो मुझे एक नई कुंजी और मूल्य जोड़ी जोड़ने की आवश्यकता होगी। मुझे यह कैसे करना है? –

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