【问题标题】:Foreach - recursion?Foreach - 递归?
【发布时间】:2018-04-22 19:11:40
【问题描述】:

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

category
    ->sub-cat
        ->sub-sub-cat
            ->sub-sub-sub-cat
                ->etc

我必须在最后一个循环中再添加一个 foreach 循环(我什至不确定你是否能理解我说实话,我什至不知道如何解释这一点 - 抱歉,请耐心等待,这是我的PHPs 'fields' 的第二个月)

所以,我正在尝试摆脱所有这些 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>';
    }       
}
?>

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

【问题讨论】:

标签: php wordpress recursion foreach woocommerce


【解决方案1】:

这里是一个递归的例子:

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

$arr = [1,2,3,[4,5,[6]]];

print_items($arr);

Function print_items($arr){ 
    Foreach($arr as $item){
        If(is_array($item)){
            print_items($item);
        }Else{
            Echo $item;
        }
    }
}

https://3v4l.org/vbjaO

【讨论】:

  • :( 这看起来像我需要的,但老实说我不明白;我完全不明白 O_o 我可以请你更具体一点吗?请:-s
  • 嗯,我会试试的。第二行代码启动函数 print_items。完整的数组被传递给函数。 foreach 开始,第一项(值 1)是一个值,表示它不是数组,并且 if() 返回 false -> echo 项。第二项 2 和 3 相同。第四个项目是一个子数组。 if(is_array(item4)) 是真的!这意味着我们用第四项调用 print_array。第 4 项是一个子数组,包含值 4、5 和另一个值为 6 的数组。第 4 项的打印数组进入 foreach。 Foreach 将 item4 拆分为另一层项目。 5 和 6 是值(值 4 和 5)和回显
  • 第 7 项是一个子数组。如果(isarray())为真。我们用 item7 调用 printarray。第六项进入 foreach。在 if(isarray()) 中测试了一组新项目(实际上只有一个,值为 6),但由于项目 6 是一个值,因此它与该值相呼应。
  • 这是一个 10 分钟的视频,可能比我的(糟糕的)描述更容易理解。 youtu.be/Mv9NEXX1VHc@emma
【解决方案2】:

特定于 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 在 cmets 中提到的,如果它适合您的情况,您应该使用内置的 walk_category_tree() WordPress 功能。

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2018-03-31
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多