array_walk_recursive不下降到嵌套数组

时间:2019-01-05 06:08:44

标签: php

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

此代码:

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

是否可以使用array_walk_recursive或其他内置函数来做到这一点?

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

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

2 个答案:

答案 0 :(得分:2)

内建函数是迭代器类。 <div class="dropdown"> <button class="dropbtn">Dropdown</button> <div class="dropdown-content"> <a href="#">Link 1</a> <a href="#">Link 2</a> <a href="#">Link 3</a> </div> </div>使迭代遍历遍历可遍历树自动进入和离开子级的过程。请注意,默认模式是仅迭代叶子。 RecursiveIteratorIteratorRecursiveIteratorIterator::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();
}

答案 1 :(得分:1)

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

您可以传递迭代次数,甚至可以传递堆栈深度。