2013-02-03 59 views
2

認爲我想要的是一個遞歸函數,但請讓我知道是否有另一種方式來實現我想要做的!我不確定我會很好地解釋這一點,所以如果您需要進一步澄清,請告訴我。建立一個遞歸函數來創建一個多維數組

我有一個功能,findSeed(),它有一個id,並返回一個包含 「種子」 信息的數組:

function findSeeds($id) { 

    global $wpdb; 

    $query = "SELECT * FROM seedTable WHERE id = " . $id; 

    $seed = $wpdb->get_row($query, ARRAY_A); 

    return $seed; 

} 

它返回下面的數組:

Array 
(
    [id] => 9 
    [name] => Sign 
    [seed1] => 4 
    [seed2] => 3 
) 

種子1和種子2是創建種子所需種子的ID。我正在尋找一個函數來創建一個多維數組,其格式如下,其中數組的第一部分包含第一個「seed」,下一個包含第一個包含的兩個種子,下一個包含兩個包含種子在每個那些,等等:

Array 
( 
    [1] => Array 
     (
      [0] => Stripey Wallpaper 
     ) 

    [2] => Array 
     (
      [0] => Green Block 
      [1] => Aqua Block 
     ) 

    [3] => Array 
     (
      [0] => Bricks 
      [1] => Grass 
      [2] => Bricks 
      [3] => Glass Pane 
     ) 

    [4] => Array 
     (
      [0] => Rock 
      [1] => Grass 
      [2] => Dirt 
      [3] => Rock 
      [4] => Rock 
      [5] => Grass 
      [6] => Rock 
      [7] => Lava 
     ) 

) 

我有(可怕的)功能,如下所示做,到目前爲止,但「地圖」可能是2個8行之間的任何東西,我掙扎,看看如何把它變成了什麼工作的一個整潔的小功能:

function makeMap($id) { 

    // First Row 

    $rowNum = 1; 

    $oneSeed = findSeeds($id); 
    $map[$rowNum][] = $oneSeed[name]; 

    // Second Row 

    $rowNum = $rowNum + 1; 

    $twoSeed = findSeeds($oneSeed[seed1]); 
    $threeSeed = findSeeds($oneSeed[seed2]); 

    $map[$rowNum][] = $twoSeed[name];   
    $map[$rowNum][] = $threeSeed[name]; 


    // Third Row 

    $rowNum = $rowNum + 1; 

    $fourSeed = findSeeds($twoSeed[seed1]); 
    $fiveSeed = findSeeds($twoSeed[seed2]); 
    $sixSeed = findSeeds($threeSeed[seed1]); 
    $sevenSeed = findSeeds($threeSeed[seed2]); 

    $map[$rowNum][] = $fourSeed[name];   
    $map[$rowNum][] = $fiveSeed[name];   
    $map[$rowNum][] = $sixSeed[name];   
    $map[$rowNum][] = $sevenSeed[name]; 

    // Fourth Row 

    $rowNum = $rowNum + 1; 

    $eightSeed = findSeeds($fourSeed[seed1]); 
    $nineSeed = findSeeds($fourSeed[seed2]); 
    $tenSeed = findSeeds($fiveSeed[seed1]); 
    $elevenSeed = findSeeds($fiveSeed[seed2]); 
    $twelveSeed = findSeeds($sixSeed[seed1]); 
    $thirteenSeed = findSeeds($sixSeed[seed2]); 
    $fourteenSeed = findSeeds($sevenSeed[seed1]); 
    $fifteenSeed = findSeeds($sevenSeed[seed2]); 

    $map[$rowNum][] = $eightSeed[name];   
    $map[$rowNum][] = $nineSeed[name];   
    $map[$rowNum][] = $tenSeed[name];   
    $map[$rowNum][] = $elevenSeed[name]; 
    $map[$rowNum][] = $twelveSeed[name];   
    $map[$rowNum][] = $thirteenSeed[name];   
    $map[$rowNum][] = $fourteenSeed[name];   
    $map[$rowNum][] = $fifteenSeed[name]; 

    return $map; 

} 

當所有的「行」的節點是空白的它應該停止,所以下面只需要ŧ O返回兩個率先「行」:

Array 
(
    [1] => Array 
     (
      [0] => Wood Block 
     ) 

    [2] => Array 
     (
      [0] => Dirt 
      [1] => Lava 
     ) 

    [3] => Array 
     (
      [0] => 
      [1] => 
      [2] => 
      [3] => 
     ) 

    [4] => Array 
     (
      [0] => 
      [1] => 
      [2] => 
      [3] => 
      [4] => 
      [5] => 
      [6] => 
      [7] => 
     ) 
) 

任何提示,提示或解決方案將不勝感激,

謝謝。

編輯:快速記錄爲什麼我喜歡它在上面的格式 - 然後我打印出結果在表中,第一個種子跨越整個行,然後分解下面的孩子,像這樣:

$map = makeMap($_POST['theItem']); 

    $colspan = count(end(array_values($map)));  

    echo '<h3>' . $map[row1][0] . '</h3><br/>'; 

    echo '<table>'; 

    foreach ($map as $row) { 

     echo '<tr>'; 

     foreach ($row as $cell) { 

      echo '<td colspan="'. $colspan .'"><div class="seed">' . $cell . '</div></td>'; 

     } 

     $colspan = $colspan/2; 

     echo '</tr>'; 

    } 

    echo '</table>'; 
+0

你也許可以嘗試改變數組的格式爲' id =>數組(**種子)'。看起來更安全,更容易處理。 – Amelia

+0

謝謝,但理想情況下,我想保持這種格式(我將在一秒內爲上述原因添加進一步的解釋!)。 –

回答

1
<?php 

$array = array('one', 'two', 'three'); 

for($i =1; $i<= count($array); $i++){ 
for($j=0; $j<$i; $j++){ 
$arrymulti[$i][$j]= $array[$j]; 
} 
} 
echo '<pre>'; 
print_r($arrymulti); 
?> 

輸出:

Array 
(
    [1] => Array 
     (
      [0] => one 
     ) 

    [2] => Array 
     (
      [0] => one 
      [1] => two 
     ) 

    [3] => Array 
     (
      [0] => one 
      [1] => two 
      [2] => three 
     ) 

) 

DEMO

+0

這不是她想要的。該結構應該基於來自數據庫的種子值,而不僅僅是一個簡單的算術級數。請重新閱讀這個問題。 – leftclickben

+0

@leftclickben我知道,它是一個例子,她可以根據自己的需求對其進行調整。我只是在兩個循環中提供了一個簡單的模式。 – 2013-02-03 12:59:58

+0

感謝你們兩位 - 起初我有點困惑,因爲這不是一個絕對的解決方案,但對我來說,看看我是否可以定製它,以便它適合我的情況,這將是一個很好的做法! –

1

您可以使用此遞歸函數,我寫這對於Class

static public $map; 
static function seeder($id,$Depth=0){ 
    $Seed=findSeeds($id); 
    if(!$Seed){ 
     return self::$map; 
    } 
    self::$map[$Depth][]=$Seed['name']; 
    self::seeder($Seed['seed1'],$Depth+1); 
    self::seeder($Seed['seed2'],$Depth+1); 
    if($Depth==0){ 
     foreach(self::$map as $k=>$v){ 
      $Flag=true; 
      foreach($v as $key=>$Value){ 
       if($Value!="")$Flag=false; 
      } 
      if($Flag){ 
       for($i=$k;$i<=count(self::$map);$i++){ 
        @unset(self::$map[$i]); 
       } 
       break; 
      } 
     } 
    } 
    return self::$map; 
} 

樣品

print_r(seeder($ID)); 

輸出類似於你的樣品

+0

非常感謝你這麼做,它幾乎是完美的,但是可能會出現這樣的情況,其中一行可以包含空白行(這些行需要保留),所以應該只在整行爲空時退出......如果這就說得通了? Sooo關閉了,我將與代碼一起玩,看看我能否實現它! –

+0

@ElisabethSadler你好,我對現在認爲必須工作的代碼做一點改變。測試它 –