2016-11-30 3 views
0

私はリクルートルーピングに問題があります。私はdbテーブルsite_pagesを持っています。私はウェブページ(CMS)を保存しています。そのページは親テーブルを持つことができます。テーブルにはparent_idがあります。php recursive looping not repeater divider

一般的に、これらの格納式でこの効果を達成したいと考えています。 1人の子供

|—|—を持っている場合は2人の子供

|—|—|— 3人の子供...上記

enter image description here

を持っている場合

|—場合は、rootである私が欲しいもの効果です。しかし、私の場合、私はこの効果を得る。ページタイトルの前に2つの仕切りが繰り返されることはありません。ここで

​​

は私の配列が何であるかを私ループ:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [title] => Home 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [title] => About us 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 5 
          [title] => Subpage #1     
          [children] => Array 
           (
            [0] => Array 
             (
              [id] => 6 
              [title] => Subpage #2          
             ) 


           ) 

         ) 

       ) 

     ) 

コードはどこでループpages配列:ここ

  <table class="table table-striped table-bordered"> 
       <thead> 
       <tr> 
        <th>Page name</th> 
        <th>Status</th> 
        <th>Actions</th> 
       </tr> 
       </thead> 
       <tbody> 
        <?php if($pages): ?> 

         <?php foreach ($pages as $index => $page): ?> 
          <tr> 
           <td><span class="gi">|—</span><?= $page['title'];?></td> 
           <td><?= $page['status'];?></td> 
           <td>N/A</td> 
          </tr> 
          <?php if(!empty($page['children'])): ?> 
           <?= fetchChilds($page['children']); ?> 
          <?php endif;?> 

         <?php endforeach; ?> 

        <?php endif; ?> 
       </tbody> 
      </table> 

と子がループしているヘルパー関数:

function fetchChilds($pages) { 

    $html = "<tr>"; 

    foreach ($pages as $child) { 

     $html .= '<td> <span class="gi">|—</span>'. $child["title"] .'</td>'; 
     $html .= '<td>'. $child["status"] .'</td>'; 
     $html .= '<td> N/A</td>'; 

     if(isset($child['children'])) { 
      $html .= fetchChilds($child['children']); 
     } 
    } 

    $html .= "</tr>"; 

    return $html; 
} 

答えて

2

いいえ出力には分周器はありません。すべてのテーブル行(なぜこれのためにテーブルを使用していますか?)には1つの接頭辞しか含まれていません。

コードを完全に書き直すことなく、私が持っている唯一のアイデアは、レベルパラメータをfetchChildsに追加することです。

function fetchChilds($pages, $level) { 

    foreach ($pages as $child) { 
     $html = "<tr>"; 
     $html .= '<td> <span class="gi">'. str_repeat("|-", $level); .'</span>'. $child["title"] .'</td>'; 
     $html .= '<td>'. $child["status"] .'</td>'; 
     $html .= '<td> N/A</td>'; 
     $html .= "</tr>"; 

     if(isset($child['children'])) { 
      $html .= fetchChilds($child['children'], $level+1); 
     } 
    } 

    return $html; 
} 

そして、あなたはあなたの他のコードにレベルを追加する必要があります。あなたはそのステップを作る場合、あなたは最上位のアレイレベルがレベル1であるとfetchChildsで使用することができることを実現するかもしれない

<?php if($pages): ?> 
    <?php foreach ($pages as $index => $page): ?> 
     <tr> 
      <td><span class="gi">|—</span><?= $page['title'];?></td> 
      <td><?= $page['status'];?></td> 
      <td>N/A</td> 
     </tr> 
     <?php if(!empty($page['children'])): ?> 
      <?= fetchChilds($page['children'],2); ?> 
     <?php endif;?> 
    <?php endforeach; ?> 
<?php endif; ?> 

同様に:

<?php if($pages): ?> 
    <?php foreach ($pages as $index => $page): ?> 
     <?= fetchChilds($page,1); ?> 
    <?php endforeach; ?> 
<?php endif; ?> 
+0

この作業には1人の子供がいれば完璧です。もし私が2人の子供を持っていたり、それ以上のものがあれば、 ''は追加されず、すべてがインラインです。例 'aboutus> sub#1> sub#2> sub 3'はすべてインラインで '​​aboutus​​​​sub 1​​sub 2' no 'tr'タグが追加されています。しかし、私は子供が1人しかいない場合は、 – Ivan

+0

あなたの権利が追加されます。私はfetchChild関数に変更しました。 構造体は、別のfetchChildを呼び出す前にforeach内にある必要があります。これを試してください。 – Seb