我需要展平多维数组,但不要压扁最后一个数组。
例如,请考虑以下数组
$array = [
1 => [
1 => [
'anna',
'alice'
],
2 => [
'bob',
'bartold'
]
],
2 => [
1 => [
'carol'
],
2 => [
'david'
]
]
];
以下代码
$result = [];
$iterator = new \RecursiveIteratorIterator(
new \RecursiveArrayIterator($array)
);
foreach ($iterator as $row) {
$result[] = $row;
}
返回以下数组
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'
]
];
不会压扁数组的最后一级。 有没有简单的方法来获得这个?
可能我想使用迭代器。
如果您愿意,可以尝试使用this。
答案 0 :(得分:2)
如果它包含子阵列并根据它更改合并,则可以在每个元素上递归展平数组,向前看:
<?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);
(注意:我确信该功能可以简化,但我对递归功能的热爱目前已达到最低限度。)
答案 1 :(得分:1)
请记住,递归迭代器总是遍历数据结构以返回数据节点,而不是前面的结构。为了保持结构,你可以做一个嵌套的foreach
$newdata = array();
foreach($data as $group) {
foreach($group as $set) {
$newdata[] = $set;
}
}