[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Любопытный код на понимание
glock18
Давеча попробовал его в качестве части тестового задания дать. Соискатель это задание завалил :) Вот мне любопытно, многие ли из форумчан поймут суть способа. Этот же код постил здесь как-то уже давно достаточно с совершенно безграмотными английскими комментариями.

Написал его давно довольно смеху ради, есть минусы свои, но и плюсы есть, поверьте, весьма даже некислые плюсы.

Итак задание для тех кто решит проверить себя (как практика показывает, оно очень непростое):

Ответы присылайте в личку, чтобы не отбивать желание решать у других ;)

Дан код, выполняющий построение дерева бесконечной глубины из одномерного массива бородатого формата (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>';


Приятного и, главное, успешного разбора ;)
Быстрый ответ:

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