我需要帮助设计一个递归函数:
<ul>
和<li>
将成为输入的数组将是目录层次结构的多维数组。 输入:
Array
(
[pocketmine] => Array
(
[tutorial] => Array
(
[0] => 1. Introduction.markdown
[1] => part3-setting-up-your-workspace.php
[2] => part1-introduction.php~
[3] => part2-planning.php~
[4] => part2-planning.php
[5] => part5-pocketmine-says-hello-world.php
[6] => part4-inter-lingual-programming-basics.php
)
[documentation] => Array
(
[0] => List of Events Alphabetical.markdown
)
)
)
第一个的输出将是
但是“1.简介”必须链接到“whateverURL / pocketmine / tutorial / 1.Introduction”
我需要将其显示为(例如)
<ul>
<li><a href=pocketmine/tutorial/1.-Introduction.markdown>1. Introduction</li>
</ul>
提前感谢您的帮助。
答案 0 :(得分:1)
使用RecursiveArrayIterator处理数据和RecursiveIteratorIterator进行模板设置,您可以按照自己的方式显示数据。这是一个快速实现
<?php
$data = array(
'pocketmine' => array
(
'tutorial' => array
(
'1.Introduction.markdown',
'part3-setting-up-your-workspace.php',
'part1-introduction.php~',
'part2-planning.php~',
'part2-planning.php',
'part5-pocketmine-says-hello-world.php',
'part4-inter-lingual-programming-basics.php',
),
'documentation' => array
(
'List of Events Alphabetical.markdown'
),
)
);
class ListIterator extends RecursiveIteratorIterator
{
protected $url_path;
protected $top_path;
public function beginChildren()
{
echo '<ul>';
}
public function endChildren()
{
//Reset url path when changing children.
$this->url_path = "";
echo '</ul></li>';
}
public function current()
{
// if current item has children then print only the key.
if ($this->callHasChildren()) {
// Store top path for urls
if ($this->getDepth() == 0) {
$this->top_path = $this->key();
} else {
// create the url path from array keys.
$this->url_path .= "/" . $this->key();
}
return $this->key();
} else {
// Get only the title without dot extension.
$dot = strrpos(parent::current(), '.');
if ($dot !== false) {
$page = substr(parent::current(), 0, $dot);
} else {
$page = parent::current();
}
// compose final url path
$path = $this->top_path . $this->url_path . "/" . parent::current();
return '<a href="'.$path.'">'. $page . '</a>';
}
}
public function beginIteration()
{
echo '<ul>';
}
public function endIteration()
{
echo '</ul>';
}
}
$iterator = new RecursiveArrayIterator($data);
$template = new ListIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($template as $item) {
echo '<li>' . $item;
echo $template->callHasChildren() == false ? '</li>' : null;
}