2010-10-06 6 views
5
$temp = array(); 
function show_keys($ar) 
{ 
    foreach ($ar as $k => $v) 
    { 
     $temp[] = $k; 
     if (is_array($ar[$k])) 
     { 
      show_keys ($ar[$k]); 
     } 
    } 

    return $temp; 
} 

मैंने उस फ़ंक्शन का उपयोग करने का प्रयास किया लेकिन यह अभी भी केवल पहली कुंजी देता है।मुझे एक array_keys_recursive()

+0

यह प्रत्यावर्तन कई मामलों में अनंत है:

$keys = [ 'first' => [ 'second' => [ 'third', ], 'deuxième', ], ]; 

किसी और को एक समान की जरूरत के लिए खोज के लिए, यहाँ मेरी समाधान है। – Svisstack

+2

शैली पर एक नोट: वैरिएबल 'temp' या' tmp', ** विशेष रूप से ** वैश्विक नामस्थान में कॉल न करें, जो भ्रम की ओर जाता है। नाम वर्णनात्मक होना चाहिए; इसे 'चाबियाँ' कहते हैं, क्योंकि इसमें यही शामिल है। – meagar

उत्तर

1

आपकी सरणी $temp वैश्विक है। फ़ंक्शन में आपको पहुंचने के लिए आवश्यक है:

global $temp; 

फ़ंक्शन की शुरुआत में।

वर्तमान में समारोह के हर मंगलाचरण नाम $temp साथ एक नई सरणी पैदा कर रही है और जब आप अंततः अपने फोन करने वाले के लिए समारोह से लौटने के लिए, $temp आप अपनी पहली कॉल में बनाया लौटे किया जा रहा है, जो केवल की कुंजी है आपके प्रथम स्तर।

ध्यान दें कि वैश्विक चर का उपयोग करना अच्छा प्रोग्रामिंग नहीं है। आपको अपनी सरणी को अपने रिकर्सिव कॉल पर तर्क के रूप में पास करने और अलेक्जेंडर और जॉन के रूप में प्रत्येक पुनरावृत्तियों में पाए गए कुंजियों को जोड़कर पारित सरणी को संशोधित करने की आवश्यकता है।

+0

कोई फर्क नहीं पड़ता, ऐसा लगता है कि यह पहली जगह $ temp स्वीकार कर रहा था। – HyderA

+0

आप शायद सही हैं, यह समाधान के करीब एक कदम था। – HyderA

4

मुख्य समस्या यह है कि आप रिकर्सिव show_keys() कॉल के परिणामों को फेंक रहे हैं। आप वापसी मूल्य के साथ कुछ भी नहीं करते हैं।

टिप्पणियां इनलाइन हैं।

function show_keys($ar) 
{ 
    // Create new temp array inside function so each recursive call gets 
    // a separate instance. 
    $temp = array(); 

    foreach ($ar as $k => $v) 
    { 
     $temp[] = $k; 

     // Use $v instead of $ar[$k]. 
     if (is_array($v)) 
     { 
      // Combine results of recursive show_keys with $temp. 
      $temp = array_merge($temp, show_keys($v)); 
     } 
    } 

    return $temp; 
} 
2

यह चाल चल सकता है?

आपको या तो वैश्विक रूप में $ temp लाएगा, या प्रत्येक रिकर्सन से लौटाए गए मूल्य को लेना होगा। और हम वैश्विक चर से बचना चाहते हैं, इसलिए हम पिछले एकत्रित मूल्यों के साथ प्रत्येक रिकर्सन कॉल से मूल्यों को मर्ज करते हैं।

function show_keys($ar) 
{ 
    $temp = array(); 
    foreach ($ar as $k => $v) 
    { 
     $temp[] = $k; 
     if (is_array($ar[$k])) 
     { 
      $temp = array_merge(show_keys ($ar[$k]), $temp); 
     } 
    } 

    return $temp; 
} 
+0

हाँ, यह किया .. धन्यवाद श्रीमान! – HyderA

0

क्योंकि यह कार्य अनंत है। लेकिन मेरे काम आप मदद करने के लिए)

function show_keys($ar, $temp = array()) 
{  
    if (!empty($ar)) { 
    foreach ($ar as $k => $v) 
    { 
     $temp[] = $k; 
     if (is_array($ar[$k])) 
     { 
      $temp += show_keys($ar[$k], $temp); 
     } 
    } 
    } 

    return $temp; 
} 
6

एसपीएल का उपयोग करना, चाबियाँ पर पाशन है काफी आसान (उन्हें एक सरणी में स्टोर यदि आप चाहें) है:

<?php 
$arr = array_fill(0,8,range(0,3)); 
var_dump($arr); 
foreach(new RecursiveIteratorIterator(
    new RecursiveArrayIterator($arr), 
    RecursiveIteratorIterator::SELF_FIRST) 
    as $key => $value){ 
     var_dump($key); 
} 
?> 
+0

चीजों को करने का बहुत बढ़िया तरीका :) और बहुत प्रभावी। धन्यवाद! –

2

मैं बहुत ज्यादा जटिल का एक बहुत देखते हैं समाधान यहाँ ....

function array_keys_r($array) { 
    $keys = array_keys($array); 

    foreach ($array as $i) 
    if (is_array($i)) 
     $keys = array_merge($keys, array_keys_r($i)); 

    return $keys; 
} 
0

प्रश्न संदिग्ध है क्योंकि आपने अपना इनपुट और अपेक्षित आउटपुट निर्दिष्ट नहीं किया है।

$array = [ 
    'first' => [ 
     'second' => [ 
      'third' => 'three', 
     ], 
     'deuxième' => 'two', 
    ], 
]; 

अन्य समाधान के सभी अब तक चाबियों का एक चपटा एक आयामी सरणी सूची प्रदान:

इस उदाहरण सरणी पर विचार करें।

$keys = [ 
    'first', 
    'second', 
    'third', 
    'deuxième', 
]; 

हालांकि, मैं एक array_keys_recursive समारोह है कि पदानुक्रम की रक्षा करेगा के लिए की जरूरत थी।

function array_keys_recursive(array $array) : array 
{ 
    foreach ($array as $key => $value) { 
     if (is_array($value)) { 
      $index[$key] = array_keys_recursive($value); 
     } else { 
      $index []= $key; 
     } 
    } 

    return $index ?? []; 
} 
संबंधित मुद्दे