我想修改键所指向的值。该值是一个数组,可能是嵌套的。键本身可以在嵌套数组结构中任意深。
此代码:
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结构中清晰可见,也许有一种使用方法?
答案 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>
使迭代遍历遍历可遍历树自动进入和离开子级的过程。请注意,默认模式是仅迭代叶子。 RecursiveIteratorIterator
或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();
}
答案 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;
}
}
您可以传递迭代次数,甚至可以传递堆栈深度。