Я работаю над организационной диаграммой в PHP, и данные извлекаются из базы данных.
Пример организационной структуры выглядит следующим образом, но имеет неизвестное количество уровней:
мне
Brandon
Дэвид
а. Аманда
б. Мишель
с. Майкл
Роберт
а. Кристен
Чарльз
Ashley
Алгоритмы обходного типа часто были моей слабостью, и мне нужна ваша помощь. Я экспериментировал со многими вариантами «обходной» функции, которая вызывала бы себя, но я просто еще не пришел к правильному решению.
Временное решение, которое у меня есть сейчас, имеет глубину всего три уровня, и вы можете понять, почему оно нереально.
foreach($user->getChildren() as $child) {
echo $child->name;
foreach($child->getChildren() as $ch) {
echo $ch->name;
foreach($ch->getChildren() as $c) {
echo $c->name;
// ... more foreach statements
}
}
}
$user
имеет class User
, а также
$user->getChildren()
содержит массив пользовательских объектов, которые имеют $user
как их родитель
Ваша функция перемещения может выглядеть примерно так:
function traverse($users)
{
if(empty($users)) return;
foreach($users as $user)
{
echo $user->name;
traverse($user->getChildren());
}
}
Таким образом, у вас есть условие остановки, которое может быть if(empty($users)) return;
или же if(count($users) == 0) return;
вы поняли, а foreach
цикл на каждом уровне, который печатает имя пользователя и снова вызывает функцию для дочерних элементов пользователя.
Вы бы назвали это как traverse([$user]);
где $user
пользователь, с которого вы хотите начать.
Других решений пока нет …