Исходный код
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>';
}
}
}