Правильный метод отображения рекурсивного массива - PullRequest
0 голосов
/ 02 сентября 2011

Извините, ребята, вернулись снова с моим рекурсивным массивом, который работает, но я не могу получить правильную "разметку", поэтому мне нужна "правильная" древовидная структура, использующая <ul>, <li>, так что вы в конечном итоге выглядите так:

  • Элемент
    • Ребенок
      • Ребенок ребенка
        • И т.д. ...

Моя функция выглядит следующим образом - пока функция работает, "макет" не предлагает, пожалуйста.

function recursive_array($results,$tbl) {
global $DBH;
$tbl = $tbl;
if (count($results)) {
    foreach($results as $res) {
        if( $res->ParentID == 0 ) { 
        echo '<ul class="recursive">';
        echo '<li>';    
        echo $res->Name;
        echo $res->Description;
        echo $res->date_added;
        echo '<ul>'; 
        }

        if( $res->ParentID != 0 ) { 
        echo '<li>';
             echo $res->Name;
             echo $res->Description;
             echo $res->date_added;
        echo '</li>';
        }


        $STH = $DBH->query("SELECT * FROM ".$tbl." WHERE ParentID  = '".$res->ID."'");
        $fquerycount = $STH->rowCount();
        $STH->setFetchMode(PDO::FETCH_OBJ);
        recursive_array($STH,$tbl);
        if( $res->ParentID == 0 ) { 
        echo '</ul></li></ul>';
        }       
    }
}
}

1 Ответ

1 голос
/ 02 сентября 2011

Я действительно не фанат рекурсивного SQL.Я использовал его, он работает, но он всегда меня удивлял как ... yeck ...

Как насчет этого: создайте topicID (своего рода селектор, который будет включать все элементы, которые выв конечном итоге хотел бы иметь вывод) и выбрать на основе этого, упорядоченный по parentID.

SELECT * FROM $tbl WHERE topicID = 1 ORDER BY parentID;

Затем вы организуете так:

$output = array();
$currentParent = -1;
while( $row = $stmt->fetch(PDO::FETCH_OBJ) )
{ 
    if( $currentParent != $row->ParentID )
    {
        $currentParent = $row->ParentID;
        $output[ $currentParent ] = array();
    }
    $output[ $currentParent ][] = $row;
}

function outputLists( array $current, array $output )
{
    echo '<ul>';
    foreach( $current as $res )
    {
        echo '<li>';
        echo $res->Name;
        echo $res->Description;
        echo $res->date_added;
        // if it is set, clearly we have a node to traverse
        if( isset( $output[ $res->ID ] ) )
             // seed the next call to the function with the new 
             // node value (found in output) and it will create
             // the appropriate ul and li tags
             outputLists( $output[ $res->ID ], $output );
        echo '</li>';
    }
    echo '</ul>';
}
// start with the group with parentID = 0
outputLists( $output[ 0 ], $output );

Итак, вместо рекурсивного SQL,у вас есть один выход из базы данных, создающий древовидную структуру в PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...