2016-04-20 19 views
0

私は再帰について学んでいます。ここではメニュー配列です。私は多くの検索をしており、そのメニュー構造では解決策が見つかりませんでした。そのデータ構造を持つ再帰的なメニュー

これらはいずれも役に立ちます。

$menu = array(
    'level' => array(
     0 => 1 
     1 => 1 
     2 => 2 
     3 => 3 
     4 => 1 
     5 => 2 
     6 => 2 
     7 => 3 
     8 => 2 
    ), 
    'title' => array(
     0 => title 1 
     1 => title 2 
     2 => title 3 
     3 => title 4 
     4 => title 5 
     5 => title 6 
     6 => title 7 
     7 => title 8 
     8 => title 9 
    ) 
) 

次のhtml構造を再帰的に生成するにはどうすればよいですか?

<ul> 
    <li>title 1</li> 
    <li>title 2 
     <ul> 
      <li>title 3 
       <ul> 
        <li>title 4</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
    <li>title 5 
     <ul> 
      <li>title 6</li> 
      <li>title 7 
       <ul> 
        <li>title 8</li> 
       </ul> 
      </li> 
      <li>title 9</li> 
     </ul> 
    </li> 
</ul> 
+0

のためのレベルとは何ですか? –

+0

html構造体があなたが提供した配列とどのような関係があるかわかりません。アイテムにサブアイテムがあることをどのように伝えることができますか? –

+0

私は構造がどこから来るのか理解しています。 –

答えて

-1

私は構造とレベルをマージしました。再帰関数が出力を作成します。 私はこのコードは簡単に理解できると思います。コメントは必要ありません。 構造体は、配列の最初の要素をtitleとして取得し、レベルを上げます。

<?php 
$menu = [ 
    'title 1', 
    [ 
     'title 2', 
     [ 
      ['title 3', 
      'title 4'] 
     ] 
    ], 
    [ 
     'title 5', 
      'title 6', 
      ['title 7', 
      'title 8'], 
      'title 9' 
    ] 
]; 

function createMenu($menu,$entry = false,$level = 1) { 
    foreach ($menu as $title) { 
     if (is_array($title)) { 
       createMenu($title,true,$level); 
       if (count($title)>1) { 
       echo str_repeat("\t",$level*2-1)."\t</ul>\n"; 
       echo str_repeat("\t",$level*2-1)."</li>\n"; 
       } 
     } else { 
      echo str_repeat("\t",$level*2-1)."<li>$title"; 
      if ($entry) { 
       echo "\n".str_repeat("\t",$level*2-1)."\t<ul>\n"; 
       $level++; 
       $entry = false; 
      } else { 
       echo "</li>\n"; 
      } 
     } 
    } 
} 
echo "<ul>\n"; 
createMenu($menu); 
echo "</ul>"; 

私はそれをお勧めいけない場合でも、あなたの質問に付着した溶液2:

<?php 
$menu = array(
    'level' => [1,1,2,3,1,2,2,3,2], 
    'title' => ["title 1","title 2","title 3","title 4","title 5","title 6","title 7","title 8","title 9"] 
); 
echo "<ul>\n"; 
//cycle levels 
$lastLevel = 1; 
foreach ($menu['level'] as $key => $level) { 
    if ($key == 0) {} 
    elseif ($level > $lastLevel) echo "\n".str_repeat("\t",$lastLevel*2)."<ul>\n"; 
    elseif ($level < $lastLevel) { 
     echo "</li>\n"; 
     for (;$level<$lastLevel;$lastLevel--) { 
      echo str_repeat("\t",($lastLevel-1)*2)."</ul>\n"; 
      echo str_repeat("\t",($lastLevel-1)*2-1)."</li>\n"; 
     } 
    } else echo "</li>\n"; 
    echo str_repeat("\t",$level*2-1).'<li>'.$menu['title'][$key]; 
    $lastLevel = $level; 
} 
echo "</li>\n"; 
//finish tags 
for (;1 < $lastLevel;$lastLevel--) { 
    echo str_repeat("\t",($lastLevel-1)*2)."</ul>\n"; 
    echo str_repeat("\t",($lastLevel-1)*2-1)."</li>\n"; 
} 
echo '</ul>'; 
+0

それは質問に答えません。 –

+0

@ di3 helli di3、あなたの答えをありがとう、しかし、私は配列があなたのマージされた配列になる方法を理解できない、あなたは詳細を与えることができますか?私の配列の上にそれをコード化するための基盤がありますか?ありがとうございました – David69

+0

私はレベルの配列の構造を使用します。レベル1は最初の配列次元です。次の次元は次の次元です。配列の最初のエントリは新しいディメンションのタイトルです。あなたはより柔軟です – di3

関連する問題