如何在没有break递归循环的情况下返回html

How to concat all the html and tell php to send html in the end of a recursive loop ?

I have recursive loop to build tree from table as (parent-child) nodes.

Functions work well but I want to return full html not to print it, so I use return, which breaks foreach loop.

 function show_full_tree($ne_id)
    {
        $store_all_id = array();
        $id_result = $this->comment_model->tree_all($ne_id);
        foreach ($id_result as $comment_id) {
            array_push($store_all_id, $comment_id['parent_id']);
        }

        //echo $this->db->last_query();exit;
         $this->in_parent(0,$ne_id, $store_all_id);
    }

    function in_parent($in_parent,$ne_id,$store_all_id) {

    if (in_array($in_parent,$store_all_id)) {
        $result = $this->comment_model->tree_by_parent($ne_id,$in_parent);
        echo  $in_parent == 0 ? "<ul class='tree'>" : "<ul>";
        foreach ($result as $re) {
            echo " <li class='comment_box'>
                <div class='aut'>".$re['comment_id']."</div>
                <div class='aut'>".$re['comment_email']."</div>
                <div class='comment-body'>".$re['comment_body']."</div>
                <div class='timestamp'>".date("F j, Y", $re['comment_created'])."</div>
            <a  href='#comment_form' class='reply' id='" . $re['comment_id'] . "'>Replay </a>";
             $this->in_parent($re['comment_id'],$ne_id, $store_all_id);
            echo "</li>";
        }
        echo  "</ul>";
    }

}

Simply make a string variable, concat all the items you would otherwise print and return it after the loop is finished. Used .= operator, which is a shorthand for adding the new string to the end of the html variable.

function in_parent($in_parent,$ne_id,$store_all_id) {

    $html = "";

    if (in_array($in_parent,$store_all_id)) {
        $result = $this->comment_model->tree_by_parent($ne_id,$in_parent);
        $html .=  $in_parent == 0 ? "<ul class='tree'>" : "<ul>";
        foreach ($result as $re) {
            $html .= " <li class='comment_box'>
            <div class='aut'>".$re['comment_id']."</div>
            <div class='aut'>".$re['comment_email']."</div>
            <div class='comment-body'>".$re['comment_body']."</div>
            <div class='timestamp'>".date("F j, Y", $re['comment_created'])."</div>
            <a  href='#comment_form' class='reply' id='" . $re['comment_id'] . "'>Replay </a>";
            $html .=$this->in_parent($re['comment_id'],$ne_id, $store_all_id);
            $html .= "</li>";
        }
        $html .=  "</ul>";
    }

    return $html;
}

You can use concatenation to build the HTML string and return it, like others suggested, or the alternative method would be to use output buffering on your existing solution:

function get_full_tree($ne_id) {
    ob_start();
    show_full_tree($ne_id);
    return ob_get_clean();
}