Tu funcion Foro(...) es recursiva, sin filtros y cada vez que la mandas llamar vuelve a leer todos los foros.
Lo mas facil seria mas o menos asi (adapta las variables):
Código php:
Ver original// Inicializas la matriz
$foro = $row['idforo'];
$padre = $row['idpadre'];
// Verificas si ya se creo la matriz para el $padre
if(!isset($foros[$padre])) $foros[$padre] = array(); // Agregas la informacion del foro donde corresponde
$foros[$padre][$foro] = $row;
}
// Puedes hacer un var_dump($foros); para que veas la estructura
// en $foros[0] quedan solo los foros que no tienen padre (es cero)
// segun tu ejemplo:
// $foros[0] tendra 1 => datos foro 1, 5 => datos foro 5
// $foros[1] tendra 2 => datos foro 2, 4 => datos foro 4
// $foros[2] tendra 3 => datos foro 3
// etc...
echo '<ul>';
listar_foros(0); // Ejecutas la funcion que creara el listado, partiendo del index
echo '</ul>';
return;
function listar_foros($padre) {
global $foros;
foreach($foros[$padre] as $foro => $datos) {
echo '<li>';
echo "<a href=\"{$datos['link_del_foro']}\">{$datos['nombre_del_foro_']}</a>";
// Verificas si el foro tiene "hijos"
if(isset($foros[$foro])) { echo '<ul>';
listar_foros($foro);
echo '</ul>';
}
echo '</li>';
}
}