从php多维数组尝试创建嵌套ul li菜单(无限制嵌套级别)

And*_*ris 5 php arrays

这是我有http://codepad.org/iDoXXsLX

有像这样的数组

Array
(
[0] => Array
    (
        [NumberRenamed] => 17
        [TopicName] => Products
        [UpperLevelNumberRenamed] => 0
    )

[17] => Array
    (
        [0] => Array
            (
                [1] => Array
                    (
                        [NumberRenamed] => 18
                        [TopicName] => Computers
                        [UpperLevelNumberRenamed] => 17
                    )
            )
    )

[18] => Array
    (
        [0] => Array
            (
                [2] => Array
                    (
                        [NumberRenamed] => 16
                        [TopicName] => Laptops
                        [UpperLevelNumberRenamed] => 18
                    )
            )
    )

[16] => Array
    (
        [0] => Array
            (
                [4] => Array
                    (
                        [NumberRenamed] => 8
                        [TopicName] => Dell
                        [UpperLevelNumberRenamed] => 16
                    )
            )
    )
)
Run Code Online (Sandbox Code Playgroud)

顶级项目是Products,第一个子级别项目是Computers,下一个子级别是Laptops,然后再次下一个子级别Dell

对于每个子级别项目UpperLevelNumberRenamed==到最接近的上级NumberRenamed.

想得到这样的结果

Products
  Computers
    Laptops
      Dell
      Acer
    Desktops
Home
Run Code Online (Sandbox Code Playgroud)

试过这个

foreach( $main_topics as $k_main_topics => $v_main_topics ){

if( isset($v_main_topics['UpperLevelNumberRenamed']) and $v_main_topics['UpperLevelNumberRenamed'] == 0 ){
//print only top level topics
echo $v_main_topics['TopicName']. '<br/>';
}

else{//if not top level topic

foreach( $v_main_topics[0] as $k_v_main_topics_0 => $v_v_main_topics_0 ){
echo $v_v_main_topics_0['TopicName']. '<br/>';
}//foreach( $v_main_topics[0] as $k_v_main_topics_0 => $v_v_main_topics_0 )

}//else{

}//foreach( $main_topics as $k_main_topics => $v_main_topics )
Run Code Online (Sandbox Code Playgroud)

但得到这个

Products
Home
Computers
Laptops
Desktops
Dell
Acer
Run Code Online (Sandbox Code Playgroud)

有些不对劲,但无法理解是什么.请提出建议需要纠正/更改代码的内容

尝试另一种方式

初始数组是一维数组.试图从一维获得ul li导航.

这是我做的http://codepad.org/OLtxyL4X

Dav*_*hen 4

以下是其作用的摘要:

  • 递归地展平数组
  • 构建多维关系图
  • 创建将 UpperLevelNumberRenamed 链接到 NumberRenamed 的一维关系
  • 将多维打印为 ul-li 列表。

这里是:

$flat = array();
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($main_topics)) as $i)
  $flat[] = $i;
$final = array();
$defs = array();
for ($i = 0; $i < count($flat); $i += 3)
    if ($flat[$i + 2] == 0) {
        $final[$flat[$i + 1]] = array();
        $defs[$flat[$i]] = &$final[$flat[$i + 1]];
    } else {
        $defs[$flat[$i + 2]][$flat[$i + 1]] = array();
        $defs[$flat[$i]] = &$defs[$flat[$i + 2]][$flat[$i + 1]];
    }

function array2ul($array) {
    $out = "<ul>";
    foreach($array as $key => $elem)
        $out = is_array($elem) ?
        $out . "<li><span>$key</span>" . array2ul($elem) . "</li>" : 
        $out = $out."<li><span>$key:[$elem]</span></li>";
    $out = $out . "</ul>";
    return $out; 
}

echo array2ul($final);
Run Code Online (Sandbox Code Playgroud)

输出

$flat = array();
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($main_topics)) as $i)
  $flat[] = $i;
$final = array();
$defs = array();
for ($i = 0; $i < count($flat); $i += 3)
    if ($flat[$i + 2] == 0) {
        $final[$flat[$i + 1]] = array();
        $defs[$flat[$i]] = &$final[$flat[$i + 1]];
    } else {
        $defs[$flat[$i + 2]][$flat[$i + 1]] = array();
        $defs[$flat[$i]] = &$defs[$flat[$i + 2]][$flat[$i + 1]];
    }

function array2ul($array) {
    $out = "<ul>";
    foreach($array as $key => $elem)
        $out = is_array($elem) ?
        $out . "<li><span>$key</span>" . array2ul($elem) . "</li>" : 
        $out = $out."<li><span>$key:[$elem]</span></li>";
    $out = $out . "</ul>";
    return $out; 
}

echo array2ul($final);
Run Code Online (Sandbox Code Playgroud)