我需要帮助设计一个递归函数:
- 递归显示多维数组
- 必须使用项目符号,例如
<ul>
和<li>
- 文本必须链接到文档。例如文本"1"。将被重定向,保持其目录结构(数组结构)。但是文本必须递归地显示。
将作为输入的数组将是目录层次结构的多维数组。输入:
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
)
)
)
第一个的输出将是
- Pocketmine
- 教程
- 1。介绍
- 教程
但"1。"Introduction"必须链接到"whateverURL/pocketmine/tutorial/1"。介绍"
我需要将其显示为(例如)
<ul>
<li><a href=pocketmine/tutorial/1.-Introduction.markdown>1. Introduction</li>
</ul>
提前感谢您的帮助
使用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;
}