Php Foreach递归?

Php Foreach递归?,php,wordpress,recursion,foreach,woocommerce,Php,Wordpress,Recursion,Foreach,Woocommerce,我有这样一个代码,它以层次顺序从基于woocommerce的网站获取所有类别和子类别,它可以工作,但每次当我想添加一个新的深度级别时 category ->sub-cat ->sub-sub-cat ->sub-sub-sub-cat ->etc 我必须在最后一个循环中再添加一个foreach循环(我甚至不确定你是否能理解我,因为我真的不知道如何解释这一点-抱歉,请耐心等待,这是我在PHPs

我有这样一个代码,它以层次顺序从基于woocommerce的网站获取所有类别和子类别,它可以工作,但每次当我想添加一个新的深度级别时

category
    ->sub-cat
        ->sub-sub-cat
            ->sub-sub-sub-cat
                ->etc
我必须在最后一个循环中再添加一个foreach循环(我甚至不确定你是否能理解我,因为我真的不知道如何解释这一点-抱歉,请耐心等待,这是我在PHPs“字段”中的第二个月)

所以,我正试图摆脱所有这些foreach循环(使其更具动态性),我听说有一种方法可以通过使用一种叫做递归的东西来做到这一点,我可以使用这种东西来实现这一点。我真的不明白这是怎么回事,我已经读了一整天了,所以如果有人能帮我理解如何完成这件事,我会很高兴的

这是我的代码,其中一部分来自StackOverflow

<ul>  
<?php
$taxonomy       = 'product_cat';
$orderby        = 'name';     
$hierarchical   = 1; 

$args = array(
    'taxonomy'     => $taxonomy,
    'orderby'      => $orderby,
    'hierarchical' => $hierarchical
);

$cat = get_categories( $args );
foreach ($cat as $c) {
    if($c->category_parent == 0) {
        $catID = $c->term_id;       
        echo '<li><a href="'. get_term_link($c->slug, 'product_cat') .'">'. $c->name .'</a>';

        $args = array(
            'taxonomy'     => $taxonomy,
            'parent'       => $catID,
            'orderby'      => $orderby,
            'hierarchical' => $hierarchical
        );

        $cat = get_categories( $args );

        if($cat) {
            echo '<ul>';
            foreach($cat as $c) {

                $catID = $c->term_id;

                echo  '<li><a href="'. get_term_link($c->slug, 'product_cat') .'">'. $c->name , apply_filters( 'woocommerce_subcategory_count_html', ' (' . $c->count . ')', $category ) .'</a>';

                $args = array(
                    'taxonomy'     => $taxonomy,
                    'parent'       => $catID,
                    'orderby'      => $orderby,
                    'hierarchical' => $hierarchical
                );

                $cat = get_categories( $args );

                if($cat){
                    echo '<ul>';
                    foreach ($cat as $c) {

                        $catID = $c->term_id;

                        echo  '<li><a href="'. get_term_link($c->slug, 'product_cat') .'">'. $c->name , apply_filters( 'woocommerce_subcategory_count_html', ' (' . $c->count . ')', $category ) .'</a>';

                        $args = array(
                            'taxonomy'     => $taxonomy,
                            'parent'       => $catID,
                            'orderby'      => $orderby,
                            'hierarchical' => $hierarchical
                        );  

                        $cat = get_categories( $args );

                        if($cat){
                            echo '<ul>';
                            foreach ($cat as $c) {

                                $catID = $c->term_id;

                                echo  '<li><a href="'. get_term_link($c->slug, 'product_cat') .'">'. $c->name , apply_filters( 'woocommerce_subcategory_count_html', ' (' . $c->count . ')', $category ) .'</a></li>';

                            }
                            echo '</ul>';
                        }
                        echo '</li>';
                    }
                    echo '</ul>';
                }
                echo '</li>';
            }
            echo '</ul>';
        }
    echo '</li>';
    }       
}
?>


虽然我知道它不太聪明,但它工作得很好,所以请不要对我太苛刻。

下面是一个递归示例:

创建一个函数,该函数将查看数组中的项(如果该项是数组),然后再次调用该函数并将该项传递给它(子数组)。
如果它不是一个数组,你就回显它


特定于WordPress的打印功能可能如下所示:

<?php
function display_child_categories_of($category_id) {
    $subcategories = get_categories(array('child_of' => category_id));
    foreach ($subcategories as $subcategory) {
        echo '<li>';
        echo $subcategory->name;
        echo '<ul class="children">';
        display_child_categories_of($subcategory);
        echo '</ul>';
        echo '</li>';
    }
}
?>

<ul>
    <?php
    display_child_categories_of(0); // gets all top-level categories
    ?>
</ul>

这是一个赤裸裸的版本;您需要将正在使用的其他参数添加到
get_categories()
参数中,然后根据需要调整HTML


但是,正如@jaswrks在评论中提到的,如果内置的
walk\u category\u tree()
WordPress函数适用于您的情况,则应改用该函数。

WordPress还提供了一个可以实现这一点的函数,因此您可以在此处查看它是否适用于您:(这看起来像是我需要的,但老实说,我一点也不明白。我能请你说得更具体一点吗?请:-sHmmm我会试试。第二行代码启动函数print_items。完整数组传递给函数。foreach启动,第一项(值1)是一个值,表示它不是数组,if()返回false->echo item。第二项2和第三项相同。第四项是子数组。If(是_数组(item4))是真的!这意味着我们使用项4调用print_数组。项4是一个子数组,包含值4、5和另一个值6的数组。项4的Printarray转到foreach。foreach将项4拆分为另一层项。5和6是值(值4和5),EchoSitem 7是子数组。If(isarray())是真的。我们用item7调用printarray。foreach中有Item 6。在if(isarray())中测试了一组新的Item(实际上只有一个,值6),但由于Item 6是一个值,它会回显该值。这是一个10分钟的视频,可能比我(糟糕的)描述更容易理解。@emma
<?php
function display_child_categories_of($category_id) {
    $subcategories = get_categories(array('child_of' => category_id));
    foreach ($subcategories as $subcategory) {
        echo '<li>';
        echo $subcategory->name;
        echo '<ul class="children">';
        display_child_categories_of($subcategory);
        echo '</ul>';
        echo '</li>';
    }
}
?>

<ul>
    <?php
    display_child_categories_of(0); // gets all top-level categories
    ?>
</ul>