Foreach – Rekursion?

Lesezeit: 5 Minuten

Foreach Rekursion
Emma

Ich habe diesen Code, der alle Kategorien und Unterkategorien von einer Woocommerce-basierten Website in einer hierarchischen Reihenfolge abruft, und er funktioniert, aber jedes Mal, wenn ich eine neue Tiefe hinzufügen möchte

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

Ich muss eine weitere foreach-Schleife innerhalb der letzten Schleife hinzufügen (ich bin mir nicht einmal sicher, ob Sie mich verstehen können, weil ich ehrlich gesagt nicht einmal weiß, wie ich das erklären soll – Entschuldigung, bitte haben Sie etwas Geduld, es ist mein zweiter Monat PHPs ‘Felder’)

Also versuche ich, all diese foreach-Schleifen loszuwerden (um es dynamischer zu machen) und ich habe gehört, dass es eine Möglichkeit gibt, dies zu tun, indem man etwas namens Rekursion verwendet, die Art von Zeug, mit dem ich dies erreichen kann . Ich verstehe nicht wirklich, wie das funktioniert, und ich habe den ganzen Tag darüber gelesen, also wenn es jemanden gibt, der mir helfen kann, zu verstehen, wie ich das hinbekomme, würde ich mich freuen?

Hier ist mein Code, ein Teil davon stammt von 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="'.%20get_term_link($c->slug,%20'product_cat')%20.'">'. $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="'.%20get_term_link($c->slug,%20'product_cat')%20.'">'. $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="'.%20get_term_link($c->slug,%20'product_cat')%20.'">'. $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="'.%20get_term_link($c->slug,%20'product_cat')%20.'">'. $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>';
    }       
}
?>

Es funktioniert perfekt, obwohl mir bewusst ist, dass es nicht zu schlau ist, also seid bitte nicht zu hart zu mir.

Hier ist ein Beispiel für Rekursion:

Sie erstellen eine Funktion, die das Element des Arrays betrachtet, wenn es sich um ein Array handelt, rufen Sie die Funktion erneut auf und übergeben das Element an sie (das Subarray).
Wenn es kein Array ist, geben Sie es aus.

$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

  • 🙁 das sieht aus wie das, was ich brauche, aber um ehrlich zu sein verstehe ich es überhaupt nicht O_o kann ich dich bitten, etwas genauer zu werden? bitte :-s

    – Emma

    9. November 2017 um 18:26 Uhr

  • Hmm ich werde es versuchen. Die zweite Codezeile startet die Funktion print_items. Das vollständige Array wird an die Funktion übergeben. Das foreach beginnt und das erste Element (Wert 1) ist ein Wert, was bedeutet, dass es kein Array ist, und das if () gibt false -> echo item zurück. Zweiter Punkt 2 und 3 dasselbe. Das vierte Element ist ein Subarray. If(is_array(item4)) ist wahr! Das heißt, wir rufen print_array mit Punkt vier auf. Element vier ist ein Subarray, das die Werte 4, 5 und ein weiteres Array mit dem Wert 6 enthält. Printarray mit item4 geht an foreach. Foreach teilt item4 auf eine andere Ebene von Items auf. 5 und 6 sind Werte (Wert 4 und 5) und Echos

    –Andreas

    9. November 2017 um 18:43 Uhr


  • Element 7 ist ein Subarray. Wenn (isarray()) wahr ist. Wir rufen printarray mit item7 auf. Punkt sechs kommt in den Foreach. Ein neuer Satz von Elementen (eigentlich nur eines, Wert 6) wird in if(isarray()) getestet, aber da Element 6 ein Wert ist, gibt es den Wert wieder.

    –Andreas

    9. November 2017 um 18:46 Uhr


  • Hier ist ein 10-minütiges Video, das wahrscheinlich einfacher zu verstehen ist als meine (dürftige) Beschreibung. youtu.be/Mv9NEXX1VHc @Emma

    –Andreas

    9. November 2017 um 18:49 Uhr


Eine WordPress-spezifische Druckfunktion könnte so aussehen:

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

Dies ist eine Barebone-Version; Sie möchten die zusätzlichen Parameter, die Sie verwenden, hinzufügen get_categories() Argumente und passen Sie dann den HTML-Code nach Bedarf an.

Wie @jaswrks in den Kommentaren erwähnte, sollten Sie jedoch die integrierte verwenden walk_category_tree() WordPress funktioniert stattdessen, wenn es für Ihre Situation funktioniert.

1002750cookie-checkForeach – Rekursion?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy