如何在 php 上为分支根创建逻辑重复

How to create a logic repetition for branch root on php

我想为 repeat 创建一个逻辑重复并在 php 上创建一个分支,结果将是这样的(这只是 html 没有重复逻辑):

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

请注意,如果您的数据集很大或代码变得比每个列表元素中的简单文本字符串更复杂,您可能需要缓存递归函数的结果,并且仅在数据为已更新。

如果我知道我可以通过其他函数访问每个 parents children,我会传递当前的 parent 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>
<? }

这是通过使用递归函数和您随后遍历的嵌套数组来完成的。以下函数可以毫无问题地深入 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>';
?>

输出:(与 OP 匹配,格式除外)

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

在线查看: https://3v4l.org/O4i2t