Консультация № 186426
29.06.2012, 17:16
0.00 руб.
0 1 0
Здравствуйте! Прошу помощи в следующем вопросе:
Я пишу баку. работу и у меня возник вопрос, а точнее загвоздка:
Задача: Пользователь зашел на сайт и решил посмотреть, как будет выглядеть его меню.
Проблема пока в сохранение и преобразования кода в нормальный вид в древовидный вид, как мне кажется.
Допустим пользователь написал код меню такой:
1. Файл
1.1 Открыть как
1.1.1 PDF
2. Правка
3. О себе
"Конечно пользователь не будет писать 1. и 1.1 для этого будет использоваться Табуляция в textarea благодаря JS";
Вот после отправки кода, у меня проблема с формирования этого кода в нормальный вид, который потом можно будет спокойно сохранить в БД.
Все динамической должно быть, поэтому я решил написать класс, так думаю удобнее и более понятнее.
Код:
Цитата: php
Код:


<?php
$MenuName=$_POST['mName']; // Название меню
$MenuCode=$_POST['mCode']; // Код меню
$MenuName="Temp"; // Для тестирование : Название
$MenuCode="привет\r\n\tимя1\r\n\tимя2\r\n\tимя3\r\nпока\r\n\tимя1\r\n\tимя2\r\n\tимя3\r\nсистема\r\n\t2\r\n\t3\r\nрабочий"; // Код меню передающийся на сервер.
// Класс меню
class Menu{
var $Name; // Название
var $Code; // Код
var $LengthCode; // Длина кода
var $TreeMenu; // Массив для сохранения пунктов ввиде древа
var $SplitCode; // Разрека элементов на строчки
var $Error; // Переменная для сохранения ошибок
/* Инициализация массива */
function Menu($MenuName,$MenuCode)
{
$this->Name=$MenuName;
$this->Code=$MenuCode;
$this->LengthCode=strlen($MenuName);
$this->TreeMenu=array();
$this->SplitCode=preg_split("/\n/",$this->Code);
// $i=$k=0;
$this->TreeCreate($this->TreeMenu);
echo "aa";
}
/* Функция для построения дерева */
function TreeCreate($TreeArray)
{
$i=$k=0;
foreach ($this->SplitCode as $key => $value)
{
if($this->CheckElementOnTab($value)==true) // Цикл зацикливания.(ошибка - я знаю это)
{
/* Если элемент имеет \t, тогда сохраняем имя родителя в ячейке [0][0]
Детей записываем в пункт [0][1], вызовам опять же функцию, но с массив для сохранения указываем [0][1]ж
Если элементов с табуляции больше нету возвращаемся назад; */
$this->TreeMenu[$i][$k+1]=$value;
$this->TreeMenu[$i][$k+1]=array();
}
else
{
$this->TreeMenu[$i][$k]=$value;
unset($this->SplitCode[$key]);
//$i++;
// return 1;
}
}
}
function CheckElementOnTab($value)
{
for($i=0;$i<strlen($value);$i++)
{
if($value[$i]=="\t")
{
return true;
}
}
return false;
}

}
$Object=new Menu($MenuName,$MenuCode);
?>

Проблема в формирование древовидного меню, я понимаю, что там сейчас ошибка, и что главная идея здесь это рекурсия.
Алгоритм у меня в голове сидит и пытался уже переписать несколько раз, но вот предел уже нервов.
Алгоритм:
Открываем цикл по элементам, если элемент не имеет \t - табуляции, значит он родитель, если сразу после элемента идет элемент с \t тогда, открываем массив в 0 колонке родитель, в 1 массив детей и заново вызываем функцию, но уже с отправкой массив со столбиком [1].

Предложения:
Если у вас есть какие-то другие мысли по поводу формирования и сохранения в базе данных этого кода, я выслушаю, если можно с блок схемами или алгоритма(словесный), примеры.

Относительно модулей для построения деревьев: Я знаю, что уже есть разработки и примеры, но я не хочу использовать эти модули, связанно с тем, что с меня это будут спрашивать, а это значит надо разбираться во всем коде модуля, так что если можно без них.

Обсуждение

Неизвестный
29.06.2012, 21:42
общий
Когда отправлял увидел ошибку, в коде глупую блин:
23 Строчка
Код:

$this->TreeArray=$this->TreeCreate($this->TreeArray);

Форма ответа