これは、再帰関数とネストした配列を使用してトラバースすることによって行われます。次の関数は、問題なくnレベル深く進むことができます。
<?php
function makeNav($item) {
$ret = '<li><a href="'.$item['url'].'">'.$item['name'].'</a>'.PHP_EOL;
if (isset($item['subPgs']) && is_array($item['subPgs']) && count($item['subPgs']) > 0) {
$ret .= '<ul>'.PHP_EOL;
foreach ($item['subPgs'] as $subPg) {
$ret .= makeNav($subPg);
}
$ret .= '</ul>'.PHP_EOL;
} else {
$ret .= '</li>'.PHP_EOL;
}
if (isset($item['subPgs']) && is_array($item['subPgs']) && count($item['subPgs']) > 0) {
$ret .= "</li>".PHP_EOL;
}
return $ret;
}
$navItems = array(
/*array(
'name' => 'Home',
'url' => '#',
'subPgs'=>array()
),*/
array(
'name' => 'Parent',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Child',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Grand Child',
'url' => '#'
),
array(
'name' => 'Grand Child',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Grand Child Child',
'url' => '#'
),
array(
'name' => 'Grand Child Child',
'url' => '#'
)
)
)
)
),
array(
'name' => 'Child',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Grand Child',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Grand Grand Child',
'url' => '#'
)
)
),
array(
'name' => 'Grand Child',
'url' => '#'
)
)
)
)
)
);
$nav = '<ul>';
foreach ($navItems as $navItem) {
$nav .= makeNav($navItem);
}
echo $nav.'</ul>';
?>
出力:
<ul>
<li>
<a href="#">Parent</a>
<ul>
<li>
<a href="#">Child</a>
<ul>
<li>
<a href="#">Grand Child</a>
</li>
<li>
<a href="#">Grand Child</a>
<ul>
<li>
<a href="#">Grand Child Child</a>
</li>
<li>
<a href="#">Grand Child Child</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#">Child</a>
<ul>
<li>
<a href="#">Grand Child</a>
<ul>
<li>
<a href="#">Grand Grand Child</a>
</li>
</ul>
</li>
<li>
<a href="#">Grand Child</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
はそれをオンラインで参照してください(書式設定を除いて、のOPと一致した):あなたが意味https://3v4l.org/O4i2t
は、 "再帰" – ArtisticPhoenix
@ArtisticPhoenixあなたが作成した場合再帰、2つのブランチを作成する方法、および各ブランチには導関数がありますか?私は繰り返して作成する必要があると感じている –
私は通常休日の週末に再帰をしません。繰り返しを行うには、あらかじめレベルの最大数を知る必要があり、再帰は<無限です。 – ArtisticPhoenix