В частности, я хочу преобразовать структуру XML в этот формат для базы данных, чтобы я мог использовать измененный обход дерева предзаказа:
структура базы данных http://sitepointstatic.com/graphics/table02.gif
Моя структура XML выглядит примерно так:
<?xml version="1.0" standalone="yes"?>
<products>
<node>
<name>Top Membership</name>
<node>
<name>Middle Membership</name>
<node>
<name>Bottom Membership</name>
<node>
<name>Some content</name>
<node>
<name>Specific content</name>
</node>
</node>
</node>
</node>
</node>
Я создал PHP-скрипт для обхода структуры XML и выгрузки мне имен, у меня просто проблемы с обработкой левого и правого значений. Я думаю, что мне, вероятно, придется изменить свою логику обхода так, чтобы она каждый раз переходила к одному листу, затем возвращалась вверх и начиналась снова, вместо того, чтобы каждый раз проходить вниз по всей ветви. Если бы я мог сделать это, то я думаю, что было бы легче рассчитать левую и правую.
Мой PHP-скрипт на данный момент:
<code><?php
$node = new SimpleXMLElement(file_get_contents('products.xml'));
echo '<pre>';
function getRowData($node, $depth)
{
//Not a leaf
if(isset($node->node))
{
echo $node->name."\t\t\t($depth) parent, children: ".count($node->children())."\n";
foreach($node->node as $n)
getRowData($n, $depth + 1);
}
else //It's a leaf
echo $node->name."\t\t\t($depth) leaf\n";
}
getRowData($node->node, 1);
echo '
';
?>
Я использую эту статью SitePoint для справки http://www.sitepoint.com/hierarchical-data-database-2/
Edit:
Пересмотренный скрипт PHP, который ближе к решению (и выводит в более качественном формате с большим количеством (возможно, соответствующих) чисел):
<?php
$node = new SimpleXMLElement(file_get_contents('products.xml'));
echo '<table border="1">';
echo '
<tr>
<th>Name</th>
<th>Depth</th>
<th>Child num</th>
<th>Children</th>
<th>Ancestors</th>
<th>Total siblings</th>
<th>"Left"</th>
<th>Parent "Left"</th>
</tr>';
function getRowData($node, $depth = 1, $child_num = 1, $prior_nodes = 0, $sibling_total = 0, $parent_left = 0)
{
echo '<tr>';
echo '
<td>'.$node->name."</td>
<td>$depth</td>
<td>$child_num</td>
<td>".(count($node->children()) - 1)."</td>
<td>$prior_nodes</td>
<td>$sibling_total</td>";
$left = $parent_left + ($child_num == 1 ? 1 : ($child_num * 2) - 1);
echo "<td>$left</td>";
echo "<td>$parent_left</td>";
echo '</tr>';
$child_num = 1;
foreach($node->node as $n)
{
getRowData(
$n,
$depth + 1,
$child_num++,
$prior_nodes + (count($node->children()) - 1),
(count($node->children()) - 1),
$left
);
}
}
getRowData($node->node);
echo '</table>';
?>