user1080247 user1080247 - 2 months ago 13
PHP Question

How to return html without break recursive loop


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>";
}

}

Answer

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>";
            $this->in_parent($re['comment_id'],$ne_id, $store_all_id);
            $html .= "</li>";
        }
        $html .=  "</ul>";
    }

    return $html;
}