我需要一个array_keys_recursive()

Hyd*_*erA 6 php arrays recursion multidimensional-array

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

    return $temp;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用该功能,但它仍然只返回第一个键.

Wri*_*ken 8

使用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);
}
?>
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 5

主要问题是您丢弃了递归调用的结果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;
}
Run Code Online (Sandbox Code Playgroud)


mea*_*gar 5

我在这里看到了很多过于复杂的解决方案......

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;
}
Run Code Online (Sandbox Code Playgroud)


cod*_*ict 0

你的数组$temp是全局的。要使您可以在您需要的功能中访问:

global $temp;
Run Code Online (Sandbox Code Playgroud)

在函数的开始处。

目前,该函数的每次调用都会创建一个具有该名称的新数组$temp,当您最终从该函数返回到其调用者时,$temp将返回您在第一次调用中创建的数组,其中仅包含第一级的键。

请注意,使用全局变量并不是好的编程。您需要将数组作为参数传递给递归调用,并通过添加每次迭代中找到的键来修改传递的数组,就像亚历山大和约翰所做的那样。