2013-02-03 94 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你好,我对现在认为必须工作的代码做一点改变。测试它 –