首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -除最后一级外的所有级别的RecursiveArrayIterator递归

PHP -除最后一级外的所有级别的RecursiveArrayIterator递归
EN

Stack Overflow用户
提问于 2015-04-15 23:12:49
回答 2查看 281关注 0票数 2

我需要展平一个多维数组,但不是展平最后一级。

例如,考虑以下数组

代码语言:javascript
复制
$array = [
    1 => [
        1 => [
            'anna',
            'alice'
        ],
        2 => [
            'bob',
            'bartold'
        ]
    ],
    2 => [
        1 => [
            'carol'
        ],
        2 => [
            'david'
        ]
    ]
];

下面的代码

代码语言:javascript
复制
$result = [];

$iterator = new \RecursiveIteratorIterator(
    new \RecursiveArrayIterator($array)
);

foreach ($iterator as $row) {
    $result[] = $row;
}

返回以下数组

代码语言:javascript
复制
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"
}

我想要得到的是:

代码语言:javascript
复制
[
    1 => [
        'anna',
        'alice'
    ],
    2 => [
        'bob',
        'bartold'
    ],
    3 => [
        'carol'
    ],
    4 => [
        'david'
    ]
];

而不是展平阵列的最后一级。有没有一种简单的方法来获得它?

可能我想使用迭代器。

如果你愿意,你可以尝试使用this

EN

回答 2

Stack Overflow用户

发布于 2015-04-16 00:03:43

您可以递归地展平数组,而在每个元素上,如果包含子数组,您将提前查看,并根据它更改合并:

代码语言:javascript
复制
<?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);

online TEST

(注意:我确信这个函数可以简化,但我对递归函数的喜爱目前已达到最低点。)

票数 2
EN

Stack Overflow用户

发布于 2015-04-15 23:43:36

请记住,递归迭代器总是遍历数据结构以返回数据节点,而不是前面的结构。要保持结构不变,可以使用嵌套的foreach

代码语言:javascript
复制
$newdata = array();
foreach($data as $group) {
    foreach($group as $set) {
        $newdata[] = $set;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29654020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档