2010-10-06 75 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

這遞歸在很多情況下是無限的。 – Svisstack 2010-10-06 13:29:46

+2

關於樣式的說明:不要在全局命名空間中調用變量'temp'或'tmp',**尤其**,這會導致混淆。名稱應該是描述性的;稱它爲「鍵」,因爲它包含了它。 – meagar 2010-10-06 13:31:28

回答

1

您的數組$temp是全球性的。要使您可以在需要的功能中訪問:

global $temp; 

在函數的開始處。

目前該功能在每次調用是創建一個名爲$temp一個新的數組,當你終於從函數返回到其調用者,你在第一次調用創建的$temp被返回,它只有的鑰匙你第一級。

請注意,使用全局變量不是很好的編程。您需要將數組作爲參數傳遞給遞歸調用,並通過添加每次迭代中發現的鍵(如Alexander和John所做的那樣)來修改傳遞的數組。

+0

沒有什麼區別,看起來好像是首先接受$ temp。 – HyderA 2010-10-06 13:23:40

+0

你可能是對的,那是更接近解決方案的一步。 – HyderA 2010-10-06 13:27:24

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 2010-10-06 13:25:26

0

Ofcause此功能是無限的。但是,我的任務是幫助你)

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

使用SPL,循環的鑰匙是很容易的(它們保存在另一個數組,如果你願意的話):

<?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

令人敬畏的做事方法:)而且非常有效。謝謝! – 2014-12-03 15:24:54

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功能,將保留的層次結構。

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

爲別人尋找一個類似的需求,這是我的解決方案:

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 ?? []; 
}