代码之家  ›  专栏  ›  技术社区  ›  HyderA

我需要一个数组键递归()

  •  6
  • HyderA  · 技术社区  · 15 年前
    $temp = array();
    function show_keys($ar)
    {
        foreach ($ar as $k => $v )
        {
            $temp[] = $k;
            if (is_array($ar[$k]))
            {
                show_keys ($ar[$k]);
            }
        }
    
        return $temp;
    }
    

    7 回复  |  直到 15 年前
        1
  •  8
  •   Wrikken    15 年前

    使用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);
    }
    ?>
    
        2
  •  5
  •   user229044    15 年前

    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;
    }
    
        3
  •  4
  •   John Kugelman Michael Hodel    15 年前

    主要的问题是您正在丢弃递归的结果 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;
    }
    
        4
  •  2
  •   Alexander Sagen    15 年前

    这也许能起到作用?

    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;
    }
    
        5
  •  2
  •   M Tomczynski    6 年前

    作为其他解决方案的补充,有可能返回扁平数组作为结果,但仍然保留有关树的信息。我们可以将嵌套键与父键连接起来。在区分相同的子键和不同的父键时,它可能有助于与其他数组进行区分

    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")
    
        6
  •  1
  •   Jeff Puckett    9 年前

    考虑这个示例数组:

    $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 ?? [];
    }
    
        7
  •  0
  •   Alex Pliutau    15 年前

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

    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;
    }
    
        8
  •  0
  •   codaddict    15 年前

    你的阵型 $temp 是全球性的。要在所需的函数中进行访问,请执行以下操作:

    global $temp;
    

    在函数开始时。

    $临时 当您最终从函数返回到其调用方时 $临时 您在第一个调用中创建的将被返回,其中只有您的第一个级别的密钥。

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