2

再帰関数が欲しいと思いますが、やりたいことを実現する別の方法があれば教えてください!これについて詳しく説明するかどうかはわかりませんが、さらに詳しい説明が必要な場合はお知らせください。

idを受け取り、「シード」に関する情報を含む配列を返す関数findSeed()があります。

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です。次の形式で多次元配列を作成する関数を作成しようとしています。配列の最初の部分には最初の「シード」が含まれ、次の部分には最初のシードに含まれる2つのシードが含まれ、次の部分には2つのシードが含まれます。それらのそれぞれに含まれるシードなど:

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; 

}

すべての「行」ノードが空白になると停止するはずなので、以下は最初の2つの「行」のみを返す必要があります。

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>';
4

2 に答える 2

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

Output:

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

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

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

)

DEMO

于 2013-02-03T12:45:23.047 に答える
1

クラス用に書いたこの再帰関数を使用できます

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));

出力はあなたのサンプルと似ています

于 2013-02-03T12:58:18.070 に答える