Php 构建递归函数以创建多维数组
我想我想要的是一个递归函数,但请告诉我是否有其他方法来实现我想要的!我不确定我是否会很好地解释这一点,所以如果您需要进一步澄清,请让我知道 我有一个函数findSeed(),它接受一个id并返回一个包含“种子”信息的数组: 它返回以下数组:Php 构建递归函数以创建多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我想我想要的是一个递归函数,但请告诉我是否有其他方法来实现我想要的!我不确定我是否会很好地解释这一点,所以如果您需要进一步澄清,请让我知道 我有一个函数findSeed(),它接受一个id并返回一个包含“种子”信息的数组: 它返回以下数组: Array ( [id] => 9 [name] => Sign [seed1] => 4 [seed2] => 3 ) 其中,种子1和种子2是创建它所需的种子ID。我希望创建一个函数来创建一个多维数
Array
(
[id] => 9
[name] => Sign
[seed1] => 4
[seed2] => 3
)
其中,种子1和种子2是创建它所需的种子ID。我希望创建一个函数来创建一个多维数组,格式如下,数组的第一部分包含第一个“种子”,下一部分包含第一个中包含的两个种子,下一部分包含每一个中包含的两个种子,依此类推:
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
)
)
到目前为止,我使用的是一个(可怕的)函数,如图所示,但“map”可以是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;
}
当所有“行”节点都为空时,它应该停止,因此下面只需要返回前两个“行”:
任何提示、提示或解决方案都将不胜感激
多谢各位
编辑:快速说明我为什么喜欢上面的格式-然后我将结果打印在表格中,第一个种子覆盖整行,然后将其分解为下面的子项,如下所示:
$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>';
$map=makeMap($_POST['ittem']);
$colspan=count(end(数组_值($map));
回显“”$地图[row1][0]。'
;
回声';
foreach($map as$row){
回声';
foreach($行作为$单元格){
回声“.$cell.”;
}
$colspan=$colspan/2;
回声';
}
回声';
您可以使用我为类编写的递归函数
print_r(seeder($ID));
输出与示例类似您可以尝试将数组的格式更改为
id=>array(**seeds)
。这似乎有点理智,也更容易处理。谢谢,但理想情况下我希望保持这种格式(我会在一秒钟内进一步解释为什么要这样做!)。这不是她想要的。该结构应该基于来自数据库的种子值,而不仅仅是一个直接的算术级数。请重读这个问题。@leftclickben我知道,这是一个她可以根据自己的需要来证明的例子。我只是在两个循环中提供了一个简单的模式。多亏了你们两位,我一开始有点困惑,因为这不是一个绝对的解决方案,但这对我来说是一个很好的实践,看看我是否可以调整它,使它适合我的情况!非常感谢您的支持,这几乎是完美的,但是可能有一种情况,其中一行可以包含空白行(需要保留这些行),因此只有当整行为空白时,它才应该退出。。。这有意义吗?很快,我会玩代码,看看是否能让它工作@ElisabethSadler您好,我对代码做了一些修改,现在我认为这些代码必须工作。测试一下
$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>';
<?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
)
)
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));