[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Код меню в древовидный вид.
Murolike
Здравствуйте, прощу помочь, с проблемой такова вида:
Пользователь вводит код меню, который представляет в виде списка (смещением является символ табуляции).
Я смог добиться того, что родители и дети разделяются, но есть ошибка, связанная с циклом и с уходом на элемент ниже.
Выручай-те.

<?php
$MenuName=$_POST['mName']; // Название меню
$MenuCode=$_POST['mCode']; // Код меню
$MenuName="Temp"; // Для тестирование : Название
$MenuCode="Выход\r\n\tКрасота\r\n\t\tОна\r\nLoser"; // Код меню передающийся на сервер.
// Класс меню

class Menu{
var $Name; // Название
var $Code; // Код
var $LengthCode; // Длина кода
var $TreeMenu; // Массив для сохранения пунктов ввиде древа
var $SplitCode; // Разрека элементов на строчки
var $Error; // Переменная для сохранения ошибок
var $CurrentLengthTab;
var $NextLengthTab;
/* Инициализация массива */
function Menu($MenuName,$MenuCode)
{
$this->Name=$MenuName;
$this->Code=$MenuCode;
$this->LengthCode=strlen($MenuName);
$this->TreeMenu=array();
$this->SplitCode=preg_split("/\n/",$this->Code);
$this->TreeMenu=$this->TreeCreate($this->TreeMenu,$this->SplitCode);
$this->PrintList($this->TreeMenu);

}
/* Функция для построения дерева */
function TreeCreate($TreeArray,$SplitCode)
{
$i=0;
$k=0;
foreach($SplitCode as $key=>$value)
{
//$key++;
if($this->CheckElementOnTab($value)==true) // Если Существует элемент Tab
{
$this->CurrentLengthTab=$this->LengthElementOfTab($value);
$this->NextLengthTab=$this->LengthElementOfTab($SplitCode[$key+1]);
if($this->CurrentLengthTab==$this->NextLengthTab) // Если текущий и следующий элемент равны по символам TAB
{
$k++;
preg_match("/[а-яА-Я0-9]{1,}/",$value,$Matches);
$TreeArray[$i][$k]=$Matches[0];
unset($SplitCode[$key]);
}
else
{
if($this->CurrentLengthTab>$this->NextLengthTab) // Если текущий больше чем следующий элемент
{
$k++;
preg_match("/[а-яА-Я0-9]{1,}/",$value,$Matches);
$TreeArray[$i][$k]=$Matches[0];
unset($SplitCode[$key]);
return $TreeArray;
}
else
{
preg_match("/[а-яА-Я0-9]{1,}/",$value,$Matches);
$TreeArray[$i][$k]=$Matches[0];
unset($SplitCode[$key]);
$k++;
$TreeArray[$i][$k]=array();
$TreeArray[$i][$k]=$this->TreeCreate($TreeArray[$i][$k],$SplitCode);

}
}
}

else
{
$TreeArray[$i][$k]=$value;
unset($SplitCode[$key]);
$TreeArray[$i][$k+1]=array();
$TreeArray[$i][$k+1]=$this->TreeCreate($TreeArray[$i][$k+1],$SplitCode);
$i++;
}
}
}

function LengthElementOfTab($value)
{
$k=0;
for($i=0;$i<strlen($value);$i++)
{
if($value[$i]=="\t")
{
$k++;
}
}

return $k++;
}
function CheckElementOnTab($value)
{
for($i=0;$i<strlen($value);$i++)
{
if($value[$i]=="\t")
{
return true;
}
}

return false;
}
function PrintList($TreeArray)
{
foreach($TreeArray as $key => $value)
{
if(is_array($value))
{
$this->PrintList($value);
}
else
{
echo $key.": ".$value."<br/>";
}
}
}
}

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




Спустя 58 минут, 35 секунд (30.06.2012 - 21:38) johniek_comp написал(а):
var использовали в php4, выбрось его, и в таком большом куске кода никто не будет разбираться, выложи только то что не работает

Спустя 21 минута, 51 секунда (30.06.2012 - 22:00) Murolike написал(а):
Блин, если уберу часть кода вопросы возникнут, ладно оставляю функцию в которой у меня реально жестокие проблемы.

/* Функция для построения дерева */
function TreeCreate($TreeArray,$SplitCode)
{
$i=0;
$k=0;
foreach($SplitCode as $key=>$value)
{
//$key++;
if($this->CheckElementOnTab($value)==true) // Если Существует элемент Tab
{
$this->CurrentLengthTab=$this->LengthElementOfTab($value);// Подсчет элементов TAB
$this->NextLengthTab=$this->LengthElementOfTab($SplitCode[$key+1]);
if($this->CurrentLengthTab==$this->NextLengthTab) // Если текущий и следующий элемент равны по символам TAB
{
$k++;
preg_match("/[а-яА-Я0-9]{1,}/",$value,$Matches);
$TreeArray[$i][$k]=$Matches[0];
unset($SplitCode[$key]);
}
else
{
if($this->CurrentLengthTab>$this->NextLengthTab) // Если текущий больше чем следующий элемент
{
$k++;
preg_match("/[а-яА-Я0-9]{1,}/",$value,$Matches);
$TreeArray[$i][$k]=$Matches[0];
unset($SplitCode[$key]);
return $TreeArray;
}
else
{
preg_match("/[а-яА-Я0-9]{1,}/",$value,$Matches);
$TreeArray[$i][$k]=$Matches[0];
unset($SplitCode[$key]);
$k++;
$TreeArray[$i][$k]=array();
$TreeArray[$i][$k]=$this->TreeCreate($TreeArray[$i][$k],$SplitCode);

}
}
}

else
{
$TreeArray[$i][$k]=$value;
unset($SplitCode[$key]);
$TreeArray[$i][$k+1]=array();
$TreeArray[$i][$k+1]=$this->TreeCreate($TreeArray[$i][$k+1],$SplitCode);
$i++;
}
}
}

Спустя 2 минуты, 26 секунд (30.06.2012 - 22:02) vital написал(а):
www.jstree.com

Спустя 33 минуты, 3 секунды (30.06.2012 - 22:35) Murolike написал(а):
Не сильно то помогло, для построения уже готового меню - да, а если меню только создается, и если брать пример один из тех, которые все таки подобны моей задаче, они не удобны для пользователей, им придется все это объяснять.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.