PHP-递归ArrayIterator在除最后一级之外的所有级别上递归
我需要展平多维数组,但不能展平最后一级PHP-递归ArrayIterator在除最后一级之外的所有级别上递归,php,arrays,recursion,iterator,Php,Arrays,Recursion,Iterator,我需要展平多维数组,但不能展平最后一级 例如,考虑下面的数组 $array = [ 1 => [ 1 => [ 'anna', 'alice' ], 2 => [ 'bob', 'bartold' ] ], 2 => [ 1 => [ 'caro
例如,考虑下面的数组
$array = [
1 => [
1 => [
'anna',
'alice'
],
2 => [
'bob',
'bartold'
]
],
2 => [
1 => [
'carol'
],
2 => [
'david'
]
]
];
array(6) {
[0]=>
string(4) "anna"
[1]=>
string(5) "alice"
[2]=>
string(3) "bob"
[3]=>
string(7) "bartold"
[4]=>
string(5) "carol"
[5]=>
string(5) "david"
}
下面的代码
$result = [];
$iterator = new \RecursiveIteratorIterator(
new \RecursiveArrayIterator($array)
);
foreach ($iterator as $row) {
$result[] = $row;
}
返回以下数组
$array = [
1 => [
1 => [
'anna',
'alice'
],
2 => [
'bob',
'bartold'
]
],
2 => [
1 => [
'carol'
],
2 => [
'david'
]
]
];
array(6) {
[0]=>
string(4) "anna"
[1]=>
string(5) "alice"
[2]=>
string(3) "bob"
[3]=>
string(7) "bartold"
[4]=>
string(5) "carol"
[5]=>
string(5) "david"
}
我想得到的是:
[
1 => [
'anna',
'alice'
],
2 => [
'bob',
'bartold'
],
3 => [
'carol'
],
4 => [
'david'
]
];
不展平阵列的最后一级。
有没有一个简单的方法来获得这个
可能我想使用迭代器
如果您愿意,您可以尝试使用。请记住,递归迭代器总是遍历数据结构以返回数据节点,而不是前面的结构。要同时保留结构,可以对每个对象执行嵌套的
foreach
$newdata = array();
foreach($data as $group) {
foreach($group as $set) {
$newdata[] = $set;
}
}
您可以递归展平阵列,而在每个元素上,如果它包含子阵列,您将向前看,并根据子阵列更改合并:
<?php
function flattenArrayWithLookAhead($include = array()) {
$new = array();
foreach($include as $item) {
if(is_array($item)) {
$containsArrays = array_reduce($item, function ($carry, $current) {
if(is_array($current) || $carry === true) return true;
else return false;
});
if($containsArrays) $new = array_merge($new, flattenArrayWithLookAhead($item));
else $new[] = $item;
} else {
$new[] = $item;
}
}
return $new;
}
$array = flattenArrayWithLookAhead($array);
您是否尝试过使用array\u walk\u recursive@briosheje是的,我试过了,结果与我用我发布的代码得到的结果完全相同。由于两个原因,你无法得到想要的结果:1)节点[1]的嵌套逻辑与节点[2]不同。2) 您以某种方式分配了不能在递归循环中逻辑地重新创建的新键(输出中的键1、2、3、4),因为它是递归的。我个人建议您要么执行嵌套的foreach循环,要么只是实现一个特殊的函数。嵌套的foreach的问题是,如果需要在根附近添加嵌套级别,我的代码将不再工作。我想唯一的解决办法是使用递归函数