[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Рекурсивный вывод дерева
T1grOK
Ловлю себя на том, что с рекурсиями у меня все очень плохо. :ph34r:
Есть задача:
class Item {
public $value;
// $subItems - такие же объекты
public $subItems = array();

public function __construct($value, array $subItems = array()) {
$this->value = $value;
$this->subItems = $subItems;
}
}

Есть дерево
$root = new Item(10, array(
'sub1' => new Item(11),
'sub2' => new Item(12, array(
'sub3' => new Item(11),
'sub4' => new Item(15)
)),

'sub3' => new Item(18),
));

Нужно создать функцию, которая выведет уровень вложенности и значение(Item $value) из данного дерева:
printTree($root);

Использовать глобальные переменные или доп. параметры нельзя.
Время - 10 минут. Но я уже час не могу понять как сделать.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Игорь_Vasinsky
laugh.gif laugh.gif laugh.gif Пятница вечер) я ничё не буду делать)))

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
johniek_comp
Цитата
На форуме: 2 года, 7 месяцев, 14 дней


м-да, php деградирует людей

_____________
user posted image
Игорь_Vasinsky
чё язвишь. покажи решение и язви.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
kaww
Хоть и вечер пятницы я попробую
function printTree(Item $node)
{
static $level = 0;
echo $level . '-' . $node->value . '<br />';
if (!empty($node->subItems)) {

++$level;
foreach ($node->subItems as $item) {
printTree($item);
}
--$level;
}
}
glock18
Цитата (johniek_comp @ 31.05.2013 - 10:42)
Цитата
На форуме: 2 года, 7 месяцев, 14 дней


м-да, php деградирует людей

Ничего. С вами он справился за
Цитата

1 год, 11 месяцев, 7 дней

wink.gif
T1grOK
Цитата (kaww @ 31.05.2013 - 10:45)
Хоть и вечер пятницы я попробую
function printTree(Item $node)
{
static $level = 0;
echo $level . '-' . $node->value . '<br />';
if (!empty($node->subItems)) {

++$level;
foreach ($node->subItems as $item) {
printTree($item);
}
--$level;
}
}

Точно. За static я совсем забыл....

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
T1grOK
Цитата (johniek_comp @ 31.05.2013 - 10:42)
Цитата
На форуме: 2 года, 7 месяцев, 14 дней


м-да, php деградирует людей

Это мне не мешает найти альтернативные решения для любой задачи. Пусть даже и не очень изящные.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Dezigo
index.php
<?php

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

include 'TreeBuilder.php';
include 'Node.php';

function console($message, $value = null) {
if (is_null($value))
echo $message . '<br/>';
else
echo $message . ': --> ' . $value . '<br/>';
}

console('Start');
try {
$run = new TreeBuilder();
$run->add(5);
$run->add(3);
$run->add(1);
$run->add(4);
$run->add(10);
} catch (Exception $e) {
console($e->getMessage());
}
console('End');
?>

TreeBuilder.php
<?php

/**
* Description of TreeBuilder
*
*
@author dezigo
*/

class TreeBuilder {

private $root = null;

private function insert($value, $node) {
if (is_null($this->root)) {
$this->root = new Node($value);
console('Root added', $value);
return;
}

//left
if ($node->value > $value) {
if (is_null($node->left)) {
$node->left = new Node($value);
console('Node left ' . $node->value, $value);
} else {
$this->insert($value, $node->left);
}
}

//right
else {
if (is_null($node->right)) {
$node->left = new Node($value);
console('Node right ' . $node->value, $value);
} else {
$this->insert($value, $node->right);
}
}
}


public function add($value) {
if (!is_int($value)) {
throw new Exception("Failed to add $value,a value supports only int type");
}
$this->insert($value, $this->root);
}
}


Node.php
<?php

class
Node {
public $left;
public $right;
public $value;

public function __construct($value) {
$this->value = $value;
}
}


Моя старая тема:
http://phpforum.ru/index.php?showtopic=67411&hl=
Быстрый ответ:

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