2017-12-24 9 views
0

私は繰り返しのロジックの繰り返しを作成して、PHPのブランチを作るために不思議に分岐ルートのためのロジックの繰り返しを作成する方法、結果は(これは繰り返しロジックだけでHTMLなしで)このようになりますは、PHP

<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 Grand Child</a> 
 
        </li><li> 
 
        <a href="#">Grand Grand 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>

+0

は、 "再帰" – ArtisticPhoenix

+0

@ArtisticPhoenixあなたが作成した場合再帰、2つのブランチを作成する方法、および各ブランチには導関数がありますか?私は繰り返して作成する必要があると感じている –

+1

私は通常休日の週末に再帰をしません。繰り返しを行うには、あらかじめレベルの最大数を知る必要があり、再帰は<無限です。 – ArtisticPhoenix

答えて

1

これは、再帰関数とネストした配列を使用してトラバースすることによって行われます。次の関数は、問題なく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

1

データセットが大きい場合や、コードがあなたの再帰関数の結果をキャッシュし、唯一のツリーを再構築する必要があり、各リスト要素で単純なテキスト文字列よりも複雑取得する場合があることに注意してくださいデータが更新されたとき。

他の機能を使用して各親の子にアクセスできることが分かっていれば、現在の親のIDを渡します。再帰は、それが動作するときは常にトリッキーで、信じられないほどシンプルです。

// assuming getChildIds($parentId) is a function that returns an array of ids 
// assuming getName($id) is a function that returns a name. 
// If you actually want "Parent", "Child", ... "Grand Grand ... Grand Child" 
// add a generation parameter to the recursive function and figure it out that way. 

function echo_child_node($parentId) { ?> 
    <li> 
     <a href="#"><?php echo getName($parentId) ?></a> 
     <?php $childIds = getChildIds($parentId); ?> 
     <?php if ($childIds) : ?> 
      <ul> 
      <?php foreach($childIds as $childId) : 
       echo_child_node($childId); 
      } ?> 
      </ul> 
     <?php endif; ?> 
    </li> 
<? }