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

数组\遍历\递归不降到嵌套数组中

php
  •  2
  • tjb  · 技术社区  · 7 年前

    我想修改一个键指向的值。该值是一个数组,可能是嵌套的。键本身可以在嵌套数组结构中任意深入。

    此代码:

    print("Walk a nested array array_walk_recursive\n");
    $a=array("a"=>1,"b"=>2,"c"=>4,"d"=>array("d2_1"=>1,"d2_2"=>array("d3_1"=>1,"d3_2"=>2)));
    var_dump($a);
    $c=0;
    array_walk_recursive($a,function($a,$b) use (&$c){
        $c++;
        print($c . ": " . $b . ' type: ' . gettype($a) . "\n");
    });
    

    给出此输出:

    Walk a nested array array_walk_recursive
    
    array(4) {
      'a' =>
      int(1)
      'b' =>
      int(2)
      'c' =>
      int(4)
      'd' =>
      array(2) {
        'd2_1' =>
        int(1)
        'd2_2' =>
        array(2) {
          'd3_1' =>
          int(1)
          'd3_2' =>
          int(2)
        }
      }
    }
    1: a type: integer
    2: b type: integer
    3: c type: integer
    4: d2_1 type: integer
    5: d3_1 type: integer
    6: d3_2 type: integer
    

    然而,我需要这些额外的输出:

    d type: array
    d2_2 type: array
    

    是否有一种方法可以通过数组“walk”递归或其他内置函数来实现这一点?

    我需要的输出在var_dump结构中清晰可见,也许有一种方法可以使用它?

    相关问题 Recursive array walk to fetch multi-level array key

    2 回复  |  直到 7 年前
        1
  •  2
  •   Pinke Helga    7 年前

    内置的是迭代器类。这个 RecursiveIteratorIterator 在可遍历树上展平iterariation,自动进入和离开子级。注意,默认模式是只在叶上迭代。 RecursiveIteratorIterator::SELF_FIRST 或 RecursiveIteratorIterator::CHILD_FIRST 改变这种行为。

    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a), RecursiveIteratorIterator::SELF_FIRST);
    
    while($it->valid())
    {
      $v = $it->current();
      echo $it->key() . ( is_scalar($v) ? " => $v" : '') . '  type: ' . gettype($it->current()) . PHP_EOL;
      $it->next();
    }
    

    使用给定数组输出:

    a => 1  type: integer
    b => 2  type: integer
    c => 4  type: integer
    d  type: array
    d2_1 => 1  type: integer
    d2_2  type: array
    d3_1 => 1  type: integer
    d3_2 => 2  type: integer
    
        2
  •  1
  •   zoonman    7 年前

    这个 array_walk_recursive() 只访问叶节点。

    您可以使用 recursion . 下面是一个例子(使用php 7来运行,旧版本有is-array或is-object)。在PHP中,可以迭代公共对象属性。

    function walk($anything) {
        if (is_iterable($anything)) {
            foreach ($anything as $key => $value) {
                echo "\n" . $key . ': ' . gettype($value);
                walk($value);
            }
        } else {
            echo ': ' . $value;
        }
    }
    

    您可以通过迭代次数,甚至是堆栈深度。

    推荐文章