PHP - RecursiveArrayIterator 在除最后一级之外的所有级别上递归

标签 php arrays recursion iterator

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

例如,考虑以下数组

$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 .

最佳答案

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

<?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

(注意:我确信该函数可以简化,但我对递归函数的热爱目前处于最低限度。)

关于PHP - RecursiveArrayIterator 在除最后一级之外的所有级别上递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29654020/

相关文章:

php - 如何使用新改进的 Dropbox-PHP API?

PHP:从 array_values() 中的值中剥离标签

java - 递归地将 1^2 到 n^2 的整数相加

javascript - 相同的功能,不同的时间行为

PHP 访问由其他命名空间元素生成的对象

PHP SoapClient : Object of class stdClass could not be converted to string

php - Laravel 验证表中不存在

javascript - 无法弄清楚mapreduce算法

c - 由于重新分配而导致执行错误

c++ - 从递归返回结果的最有效方法是什么?