Php 我需要一个数组\u keys\u recursive()

Php 我需要一个数组\u keys\u recursive(),php,arrays,recursion,multidimensional-array,Php,Arrays,Recursion,Multidimensional Array,我尝试使用该函数,但它仍然只返回第一个键。您的数组$temp是全局的。要在您需要的功能中访问,请执行以下操作: $temp = array(); function show_keys($ar) { foreach ($ar as $k => $v ) { $temp[] = $k; if (is_array($ar[$k])) { show_keys ($ar[$k]); } }

我尝试使用该函数,但它仍然只返回第一个键。

您的数组
$temp
是全局的。要在您需要的功能中访问,请执行以下操作:

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

    return $temp;
}
在函数的开头

当前,该函数的每次调用都会创建一个名为
$temp
的新数组,当您最终从该函数返回到其调用方时,您在第一次调用中创建的
$temp
将被返回,该数组只有您的第一级键


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

主要问题是您正在丢弃递归
show_keys()
调用的结果。您不会对返回值执行任何操作

注释是内联的

global $temp;

这可能会奏效吗

您必须要么引入$temp作为全局变量,要么从每个递归中获取返回值。我们希望避免全局变量,所以我们将每个递归调用的值与以前收集的值合并

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;
}

因为这个函数是无限的。但我的任务是帮助你)


使用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);
}
?>

这个问题不明确,因为您没有指定输入和预期输出

考虑以下示例阵列:

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;
}
到目前为止,所有其他解决方案都提供了一个平坦的一维键数组列表

$array = [
    'first' => [
        'second' => [
            'third' => 'three',
        ],
        'deuxième' => 'two',
    ],
];
但是,我需要一个
array\u keys\u recursive
函数来保留层次结构

$keys = [
    'first',
    'second',
    'third',
    'deuxième',
];
对于其他正在寻找类似需求的人,以下是我的解决方案:

$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 ?? [];
}
例如:

function array_keys_flatten_recursive($array, $parentKey = "") {
    $keys = array_keys($array);
    foreach ($array as $parentKey => $i)
      if (is_array($i)) {
        $nestedKeys = array_keys_flatten_recursive($i, $parentKey);
        foreach($nestedKeys as $index => $key) {
            $nestedKeys[$index] = $parentKey . "." . $key;
        }
        $keys = array_merge($keys, $nestedKeys);
      }
    return $keys;
}

没有区别,似乎它一开始就接受了$temp。你可能是对的,这离解决方案又近了一步。这种递归在很多情况下是无限的。关于风格的一个注意事项:不要调用变量
temp
tmp
,特别是在全局命名空间中,这会导致混乱。名字应该是描述性的;称它为
,因为它包含的就是这些。
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 ?? [];
}
function array_keys_flatten_recursive($array, $parentKey = "") {
    $keys = array_keys($array);
    foreach ($array as $parentKey => $i)
      if (is_array($i)) {
        $nestedKeys = array_keys_flatten_recursive($i, $parentKey);
        foreach($nestedKeys as $index => $key) {
            $nestedKeys[$index] = $parentKey . "." . $key;
        }
        $keys = array_merge($keys, $nestedKeys);
      }
    return $keys;
}
$array = array(
    "one" => array(
        "one" => "lorem"
    ),
    "two" => array(
        "one" => "lorem"
    )
);


// result : array("one", "two", "one.one", "two.one")