Php Foreach递归?
我有这样一个代码,它以层次顺序从基于woocommerce的网站获取所有类别和子类别,它可以工作,但每次当我想添加一个新的深度级别时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
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>