@LiguidCool

Каким образом можно вывести переменную типа static из рекурсивной функции?

Возможно горожу костыль... Но все же.
Есть таблица в MySQL, которая содержит дерево по виду m_id, m_parent_id, m_name. Я хочу рекурсивно вывести все дочерние элементы ветки.
function GetChildren($m_id){
	global $db, $tbl_main;
	static $aux;
	$SQL="SELECT m_id, m_name, m_parent_id
		FROM $tbl_main 
		WHERE m_parent_id=$m_id
		ORDER BY m_sort";
	$query=$db->Execute($SQL);
	
	while ($array = $query->FetchRow()) {
			$children[] = array('id' => $array['m_id'], 'name' => $array['m_name']);
	}
	
	if ($children){
		foreach ($children as $value){
			// print_r ($value);
			$aux[] = $value;
			print_r($aux);
			GetChildren($value['id']);
		}
	} 
	return $children;
}
print '<pre>';
GetChildren($root_id);
// print_r(GetChildren($root_id));
print '</pre>';

Соответственно каждый раз результат присваивается переменной $aux и выводится она как-бы по нарастающей. Как мне правильно вывести только конечный результат? Объявлять переменную глобально?
Спасибо.
  • Вопрос задан
  • 214 просмотров
Решения вопроса 2
Использовать return как минимум, и не выводить ничего внутри функции

function GetChildren($m_id){
  global $db, $tbl_main;
  $SQL="SELECT m_id, m_name, m_parent_id
    FROM $tbl_main 
    WHERE m_parent_id=$m_id
    ORDER BY m_sort";
  $query=$db->Execute($SQL);
  
  while ($array = $query->FetchRow()) {
      $children[] = array('id' => $array['m_id'], 'name' => $array['m_name']);
  }
  
  if ($children){
    foreach ($children as $value){
      $aux[] = GetChildren($value['id']);
    }
  } 
  return $aux[];
}
print '<pre>';

// print_r(GetChildren($root_id));
print '</pre>';
Ответ написан
Комментировать
jakulov
@jakulov
Чтобы понять рекурсию, нужно понять рекурсию.
Делать вывод внутри функции не очень хорошая идея, лучше сначала получить массив данных, а потом уже с ним извращаться как угодно.
Static переменные вообще не предназначены для вашей задачи и вообще не используюйте их по возможности.

<?php
function getChildren($m_id,  $m_name) {
    global $db, $tbl_main;
    $SQL = 
"SELECT m_id, m_name, m_parent_id FROM $tbl_main 
WHERE m_parent_id = $m_id ORDER BY m_sort";
    $query = $db->query($SQL);
   // получим массив, в котором будет дерево элементов в иерархическом порядке
    $tree = [
        'id' => $m_id,
        'name' => $m_name,
        'children' => [], 
    ];
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
        $tree['children'][] = getChildren($row['m_id'], $row['m_name']);
    }

    return $tree;
}

print '<pre>';
print_r(getChildren($root_id, $root_name));
print '</pre>';
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
chlp
@chlp
фулстек
Как вы используете то, что ваша функция возвращает $children?
Вы можете возвращать $aux (или если нужно массив из ($aux и $children) и уже в конце печатать $aux:
print '<pre>';
print_r(GetChildren($root_id));
print '</pre>';
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы