Login
Делаю тестовое задание
285 просмотров
Перейти к просмотру всей ветки
Posmotrim знакомое лицо
in Antwort miltorg 25.09.14 21:55
так его не искать, нужно, а реализовать :)
вот держи, с минимальной оптимизацией. допилишь, если нужно:
вот держи, с минимальной оптимизацией. допилишь, если нужно:
public function actionTest()
{
//вот тут сделаешь чтение посредством mysqli, как тебе нужно в задании
//я для теста посредством yii загнал все записи в массив ассоциативных массивов
$cmd = Yii::app()->db->createCommand("select * from table1");
$items = $cmd->queryAll(true);
$helper = new SumCalculator($items);
foreach($items as $item)
{
echo "{$item['id']}\t{$item['parent_id']}\t{$item['name']}\t{$item['value']}\t";
echo $helper->calc($item['id']) . "
\n";
}
}
ну и сам расчёт с минимальной оптимизацией
class SumCalculator
{
private $sums = [];
private $key2val = [];//словарь (ключ => значение)
private $children = []; //словарь (ключ => [child1, child2, ...])
function SumCalculator($items)
{
foreach($items as $item)
{
$this->key2val[$item['id']] = $item['value'];
if($item['parent_id'] != 0)
{
$this->children[$item['parent_id']][] = $item['id'];
}
}
}
public function calc($id)
{
if(!isset($this->sums[$id]))
{
$sum = $this->key2val[$id];
if(isset($this->children[$id]))
{
foreach($this->children[$id] as $child_id)
{
$sum += $this->calc($child_id);
}
}
$this->sums[$id] = $sum;
}
return $this->sums[$id];
}
}
