2010-03-24 37 views
5

की मूल कुंजी खोजें मैं एक सरणी की मूल कुंजी के मान को वापस करने का कोई तरीका ढूंढने का प्रयास कर रहा हूं।PHP - सरणी

उदाहरण के लिए, नीचे दिए गए सरणी से मैं माता-पिता की कुंजी जहां $ array ['id'] == "0002" ढूंढना चाहता हूं। मूल कुंजी स्पष्ट है क्योंकि इसे यहां परिभाषित किया गया है (यह 'उत्पाद' होगा), लेकिन आमतौर पर यह गतिशील होगा, इसलिए समस्या। 'आईडी' और 'आईडी' का मान यद्यपि जाना जाता है।

[0] => Array 
     (
      [data] => 
      [id] => 0000 
      [name] => Swirl 
      [categories] => Array 
       (
        [0] => Array 
         (
          [id] => 0001 
          [name] => Whirl 
          [products] => Array 
           (
            [0] => Array 
             (
              [id] => 0002 
              [filename] => 1.jpg 
             ) 
            [1] => Array 
             (
              [id] => 0003 
              [filename] => 2.jpg 
             ) 
           ) 
         ) 
       ) 
     ) 

उत्तर

1

एक छोटी सी क्रूड प्रत्यावर्तन, लेकिन यह काम करना चाहिए:

function find_parent($array, $needle, $parent = null) { 
    foreach ($array as $key => $value) { 
     if (is_array($value)) { 
      $pass = $parent; 
      if (is_string($key)) { 
       $pass = $key; 
      } 
      $found = find_parent($value, $needle, $pass); 
      if ($found !== false) { 
       return $found; 
      } 
     } else if ($key === 'id' && $value === $needle) { 
      return $parent; 
     } 
    } 

    return false; 
} 

$parentkey = find_parent($array, '0002'); 
+0

मैं प्रत्यावर्तन के साथ भी परिचित नहीं हूँ, लेकिन मैं यह करने के लिए एक समान जवाब ऊपर कोडित, केवल मैं एक 'स्थिर' चर इस्तेमाल किया आपके द्वारा उपयोग किए जाने वाले '$ पैरेंट' तर्क को प्रतिस्थापित करने के लिए। क्या कोई रास्ता बेहतर है? – alex

+0

@alex 'static' शायद ठीक से काम करेगा। मुझे यह मानना ​​है कि मैं 'स्थिर' उपयोगकर्ता का अधिक नहीं हूं। :) यह अतिरिक्त चर के साथ पारित करने की आवश्यकता को खत्म कर देगा। ओटीओएच, उपरोक्त फ़ंक्शन में आप "डिफ़ॉल्ट" अभिभावक निर्दिष्ट कर सकते हैं ... या तो मुझे लगता है कि ठीक है। :) – deceze

+0

धन्यवाद, मैं आपकी विधि के लाभों को समझता हूं। +1 – alex

2

जब से तुम एक वृक्ष संरचना एक BFS या DFS के दोनों कर सकते हैं। चूंकि संरचना परिवर्तनीय है क्योंकि एक पुनरावर्ती समाधान अच्छी तरह से काम करेगा। जब आप मान पाते हैं तो बस एक सेंटीनेल लौटाएं, फिर कॉलर में कुंजी वापस करें।

-2
function array_to_xml($array, $rootElement = null, $xml = null) { 

    $_xml = $xml; 

    if ($_xml === null) { 
     $_xml = new SimpleXMLElement($rootElement !== null ? $rootElement : '<root/>'); 
    } 

    $has_int_key = 0; 

    foreach ($array as $k => $v) { 
     if (is_array($v)) { 
      if(is_int($k)){ 
       $this->array_to_xml($v, $k, $_xml->addChild($rootElement)); 
      } 
      else { 
       foreach($v as $key=>$value) { 
        if(is_int($key)) $has_int_key = 1; 
       } 

       if ($has_int_key) { 
        $this->array_to_xml($v, $k, $_xml); 
       } else { 
        $this->array_to_xml($v, $k, $_xml->addChild($k)); 
       } 
      } 
     } 
     else { 
      $_xml->addChild($k, $v); 
     } 
    } 

    return $_xml->asXML(); 

}