Написал его давно довольно смеху ради, есть минусы свои, но и плюсы есть, поверьте, весьма даже некислые плюсы.
Итак задание для тех кто решит проверить себя (как практика показывает, оно очень непростое):
Ответы присылайте в личку, чтобы не отбивать желание решать у других ;)
Дан код, выполняющий построение дерева бесконечной глубины из одномерного массива бородатого формата (id - parent_id). Нужно объяснить принцип его работы, как и почему получается дерево любой глубины без рекурсии, ну и вообще все что поняли :p Алгоритм сам прост, но в коде добавлен избыточный код специально для вашего удовольствия :) Определить где избыточный, а где необходимый кусок - тоже часть задания. Итак код:
<?php
$initialId = 1;
$fetchedObjects = array();
function doQuery($ids, $order = 1)
{
switch ($order)
{
case 1:
return array(
2 => array(
'id' => 2,
'name' => 'Ted',
'parentId' => 0,
),
5 => array(
'id' => 5,
'name' => 'Pete',
'parentId' => 0,
),
7 => array(
'id' => 7,
'name' => 'Fred',
'parentId' => 0,
),
18 => array(
'id' => 18,
'name' => 'Andrew',
'parentId' => 0,
)
);
case 2:
return array(
1 => array(
'id' => 1,
'name' => 'Random guy 1',
'parentId' => 5,
),
4 => array(
'id' => 4,
'name' => 'Random guy 2',
'parentId' => 5,
),
12 => array(
'id' => 12,
'name' => 'Random guy 3',
'parentId' => 7,
),
43 => array(
'id' => 43,
'name' => 'Random guy 4',
'parentId' => 18,
)
);
default:
return array(
122 => array(
'id' => 122,
'name' => 'Random guy 5',
'parentId' => 12,
),
123 => array(
'id' => 123,
'name' => 'Random guy 6',
'parentId' => 12,
),
1122 => array(
'id' => 1122,
'name' => 'Random guy 7',
'parentId' => 12,
),
124 => array(
'id' => 124,
'name' => 'Random guy 8',
'parentId' => 12,
)
);
}
}
$queryOrder = 1;
$objects = doQuery($initialId, $queryOrder);
do
{
$idsToFetch = array();
if (is_array($objects))
{
$idsToFetch = array_diff_key($objects, $fetchedObjects);
if (empty($idsToFetch))
{
break;
}
$fetchedObjects += $objects;
$objects = doQuery($idsToFetch, ++$queryOrder);
}
} while (!empty($idsToFetch));
echo 'Queries done: ' . $queryOrder;
echo '<pre>Fetched users';
print_r($fetchedObjects);
echo '</pre>';
$tree = array();
foreach ($fetchedObjects as $id => &$object)
{
if ($object['parentId'] == 0)
{
$tree[$id] = &$object;
}
else
{
$fetchedObjects[$object['parentId']]['items'][$id] = &$object;
}
}
unset($fetchedObjects);
echo '<pre>Tree';
print_r($tree);
echo '</pre>';
Приятного и, главное, успешного разбора ;)