php递归循环不重复分隔符

时间:2016-11-30 16:08:10

标签: php

我有重复循环的问题。我有db table site_pages,我在那里存储网页(cms),并且那些页面可以让父whitch与某些表中的parent_id相关。

一般希望用这些可伸缩的方式达到这种效果。

|—如果是root,如果有一个孩子

|—|—如果有两个孩子

|—|—|—三个孩子......

enter image description here

以上是我想要的效果。但就我而言,我得到了这个效果。在页面标题之前没有重复的两个分隔符。

enter image description here

这是我的数组循环:

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;
}

1 个答案:

答案 0 :(得分:2)

没有。输出中没有重复的分隔符。因为每个表行(为什么要使用表?)只包含一个| - 前缀。

如果没有完全重写代码,我唯一的想法是为fetchChilds添加一个level-param。

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;
}

然后你需要为你的其他代码添加一个级别:

<?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; ?>

如果您执行该步骤,您可能会发现最顶层的数组级别为1级,并且也可以在fetchChilds中使用:

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