由子项展平RecursiveIteratorIterator数组

时间:2013-10-09 16:08:44

标签: php

我似乎无法找到最佳方法。我有RecursiveIteratorIterator

$info = new RecursiveIteratorIterator(
    new GroupIterator($X), # This is a class that implements RecursiveIterator
    RecursiveIteratorIterator::SELF_FIRST
);

注意:GroupIterator是一个处理我们自定义格式数据的类

当我循环通过它时,我得到了我期望的结果。

foreach($info as $data){
    echo $info->getDepth().'-'.$data."\n";
}

输出结果为:

0-a
1-b
2-c
2-d
1-e
2-f
0-g
1-h
2-i

到目前为止这是正确的。现在,我想要的是将父母和孩子压扁成一个阵列。我希望每个最大深度的孩子都有一行。我想要的输出是:

0-a 1-b 2-c
0-a 1-b 2-d
0-a 1-e 2-f
0-g 1-h 2-i

我无法弄清楚如何做到这一点。循环上的每次迭代都会给我另一行,我如何将这些行组合在一起?

2 个答案:

答案 0 :(得分:1)

我设法搞清楚了。 @ComFreek指出了我正确的方向。我没有使用计数器,而是使用当前深度检查我何时触及最低的子节点,然后将数据添加到最终数组中,否则我将其添加到临时数组中。

$finalArray = array();
$maxDepth = 2;
foreach($info as $data){
    $currentDepth = $info->getDepth();

    // Reset values for next parent
    if($currentDepth === 0){
        $currentRow = array();
    }

    // Add values for this depth
    $currentRow[$currentDepth] = $data;

    // When at lowest child, add to final array
    if($currentDepth === $maxDepth){
        $finalArray[] = $currentRow;
    }
}

答案 1 :(得分:0)

尝试添加计数器变量:

// rowNr loops through 0, 1, 2
$rowNr = 0;
$curData = [];
$outputData = [];

foreach($info as $data){
  // got last element, add the temp data to the actual array
  // and reset temp array and counter
  if ($rowNr == 2) {
    $outputData[] = $curData;
    $curData = [];
    $rowNr == 0;
  }
  else {
    // save temp data
    $curData[] = $info->getDepth() . '-' . $data;
  }
  $rowNr++;
}