2013-10-09 128 views
2

我似乎無法找出最好的方法來做到這一點。我有一個RecursiveIteratorIteratorFlatten 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 

我想不出如何做到這一點。循環中的每次迭代都會給我另一行,我如何將所需的行組合到一起?

回答

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; 
    } 
} 
+0

我很高興你解決了它! – ComFreek

+0

@ComFreek:是的,我也是。 :) –

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++; 
} 
+0

這很接近,但並不像我想象的那樣工作。 「foreach」的第四次迭代也在深度2,所以我想要'0-a 1-b 2-d'。 –

+0

@RocketHazmat我完全誤解了你的問題,對不起。爲了建立你想要的表,有沒有任何模式或算法?你是否總是把當前行的最後一個n深度元素放在正確的位置? – ComFreek

+0

儘管如此,你確實幫助了我指出了正確的方向,所以謝謝。是啊。基本上,我想爲所有最低的孩子提供完整的「路徑」(這有道理嗎?)。 –