У меня есть следующие две функции, которые должны возвращать древовидное раскрывающееся меню.
PHP:
function getCategories()
{
$src = $this->db->query('SELECT * FROM categories')->fetchAll();
return $this->tree($src, 0, '');
}
function tree($src, $level, $html)
{
$dashes = '';
for($i=0;$i<$level;$i++)
{
$dashes .= '-';
}
foreach($src as $row)
{
if($row['parent'] == $level)
{
$html .= '<option value="'. $row['id'] .'">'. $dashes . $row['name'] .'</option>';
}
}
$html .= $this->tree($src, $level + 1, $html);
return $html;
}
Ожидаемый результат HTML:
<option value="1">Category1</option>
<option value="2">-Category2</option>
<option value="3">--Category3</option>
<option value="4">-Category4</option>
Но это приводит к бесконечному циклу. Зачем?
Каждая рекурсия должна иметь базовый регистр. Точка, где рекурсия останавливается.
В настоящий момент вы безоговорочно выполняете рекурсивный вызов, поэтому, естественно, вы получите бесконечную рекурсию.
tree
безусловно приведет к другому вызовуtree
, что приведет к другому вызовуtree
и т. Д.