我需要展平一个多维数组,但不是展平最后一级。
例如,考虑以下数组
$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。
发布于 2015-04-16 00:03:43
您可以递归地展平数组,而在每个元素上,如果包含子数组,您将提前查看,并根据它更改合并:
<?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);(注意:我确信这个函数可以简化,但我对递归函数的喜爱目前已达到最低点。)
发布于 2015-04-15 23:43:36
请记住,递归迭代器总是遍历数据结构以返回数据节点,而不是前面的结构。要保持结构不变,可以使用嵌套的foreach
$newdata = array();
foreach($data as $group) {
foreach($group as $set) {
$newdata[] = $set;
}
}https://stackoverflow.com/questions/29654020
复制相似问题