PHP движущийся узел дерева MySQL
Вопрос
У меня проблемы с попытками перемещать подзму или родительские узлы вверх или вниз ... не так хорошо в математике.
CREATE TABLE IF NOT EXISTS `pages` ( `page-id` mediumint(8) unsigned
Не null auto_increment,
page-left
MediumInt (8) без знака не нулевой,
page-right
Smallint (8) без знака не нулевой,page-title
текст не нулевой,
page-content
текст не нулевой,
page-time
int (11) без подписи не нулевой,page-slug
текст не нулевой,
page-template
текст не нулевой,
page-parent
MediumInt (8) без знака не нулевой,page-type
текст не нулевой, первичный ключ (page-id
)) Двигатель = myisam default charset = latin1;Вставить в
pages
(page-id
,page-left
,page-right
,page-title
,page-content
,page-time
,page-slug
,page-template
,page-parent
,page-type
) Значения (17, 1, 6, '1', '', 0, 'parent', '', 0, ''), (18, 2, 5, '2', '', 0, 'sub' , '', 17, ''), (19, 3, 4, '3', '', 0, 'sub-sub', '', 18, ''), (20, 7, 8, '5 ',' ', 0,' test ',' ', 0,' '');
В качестве примера, как я бы перенесли тест над родителем и скажем, переместите подразделение вниз внизу, играя с идентификаторами с правом страницы/правом страницы? Код не требуется только помогать с концепцией SQL или математикой для него, поможет мне понять, как его перемещать лучше ...
Решение
Итак, в основном вы хотите преобразовать список смежности в вложенный набор? Сначала обновите свой список смежности (т.е. обновите значения page_parent до правильных значений для вашего нового дерева), затем запустите преобразование ниже.
Использование PHP (базовый код, непроверенный):
class Tree
{
private $count = 0;
private $data = array();
/**
* Rebuild nested set
*
* @param $rawData array Raw tree data
*/
public function rebuild($rawData)
{
$this->data = $rawData;
$this->count = 1;
$this->traverse(0);
}
private function traverse($id)
{
$lft = $this->count;
$this->count++;
if (isset($this->data[$id])) {
$kid = $this->data[$id];
if ($kid) {
foreach ($kid as $c) {
$this->traverse($c);
}
}
}
$rgt = $this->count;
$this->count++;
// TODO: Update left and right values to $lft & $rgt in your DB for page_id $id
...
}
}
Когда вы называете это, $ rawdata должен содержать массив идентификаторов, индексированных от Parent-ID, вы можете создать его (в зависимости от структуры вашей таблицы) следующим образом ($ DB должен содержать активный объект соединения PDO):
$sql = 'SELECT page_id, page_parent FROM pages ORDER BY page_parent';
$stmt = $db->prepare($sql);
$rawData = array();
$stmt->execute();
while ($row = $stmt->fetch()) {
$parent = $row['page_parent'];
$child = $row['page_id'];
if (!array_key_exists($parent, $rawData)) {
$rawData[$parent] = array();
}
$rawData[$parent][] = $child;
}
Чтобы сделать обращение, вам понадобится что -то вроде:
$tree = new Tree();
$tree->rebuild($rawData);
Таким образом, в основном вы создаете массив, содержащий все узлы в вашем дереве, индексируемое родителем, который будет пересекать рекурсивным образом, чтобы определить правильные значения левого и правого на узел.
Кстати, вы можете сделать это в простом SQL (после адаптации имен таблицы/столбцов):http://bytes.com/topic/mysql/answers/638123-regenerate-nested-set-using-parent_id Структуру