Неудачная организация данных


Исходный код

global $page_parent; // Целочисленный массив с айдями родителя страницы
global $page_title; //Строковый массив с названиями страниц
global $page_dir; //Целочисленный массив массивов списка страниц в странице (o_O)
global $page_dirs;//Количество страниц в странице, если 0 то страница не содержит
function TreeBuild($ina)
{
	foreach ($page_dir[$ina] as $ina)
	{
		echo $ina.'=>'.$page_dirs[$ina].'<br>';
		if ($page_dirs[$ina] != 0)
		{
			TreeBuild($ina);
		}
	}
	return 0;
}

Что не так в этом коде

Отдельные массивы вместо объектов

Главная проблема здесь в том, что вместо массива объектов здесь использованы четыре отдельные массива, в результате чего данные каждой сущности необходимо собирать из четырёх разных мест.

Невооружённым глазом видно, что здесь имеет место некая сущность «страница» со следующими свойствами:

  • идентификатор
  • родительская страница
  • дочерние страницы
  • заголовок

Поэтому:

class Page {
	private id;
	private $parent;
	private $children = [];
	private $title;
}

Каким образом и на основе чего здесь создаются страницы — я не знаю, поэтому прописывать методы не буду, но минимально в классе необходимы конструктор и метод добавления дочерней страницы. Также не помешает метод для проверки наличия дочерних страниц.

class Page {
	// поля
  public function construct($title) {
		$this->title = $title;
	}

	public function addChild($child) {
		$this->children[] = $child;
		$child->parent = $this;
	}

	public function hasChildren() {
		return !empty($this->children);
	}
}

Неудачное название метода

В исходном коде метод BuildTree делает не build, а отладочную визуализацию уже построенного дерева. Я бы предпочёл название вроде debug или showStructure.

Изменение смысла переменной

Внутри функции переменная $ina используется в двух смыслах: это идентификатор текущей (родительской) страницы, и одновременно идентификатор дочерней страницы во время обхода всех дочерних страниц.

Такое изменение смысла переменной может приводить к сложнообнаруживаемым багам.

Я бы назвал переменную для дочернего идентификатора $child_ina.

Недостаточная наглядность

При выводе дочерних страниц не используются отступы, что затрудняет чтение отладочного вывода.

Отрефакторенный код

class Page {
	// поля и основные методы
  public function debug() {
		echo $this->id, ': ', $this->title;
		if ($this->hasChildren()) {
			echo '<ul>';
			foreach ($this->children as $child) {
				echo '<li>';
				$child->debug();
				echo '</li>';
			}
			echo '</ul>';
		}
	}
}