2010-10-06 74 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 ?? []; 
}