Skip to content

Instantly share code, notes, and snippets.

@finoghentov
Last active June 21, 2023 16:25
Show Gist options
  • Save finoghentov/fd8d8050cccc3fd2606b0381d318a76f to your computer and use it in GitHub Desktop.
Save finoghentov/fd8d8050cccc3fd2606b0381d318a76f to your computer and use it in GitHub Desktop.
interface HasLevel {
/**
* @return int
*/
public function getLevel();
}
class Node implements HasLevel {
public $items = [];
public $level = 0;
public $childNode;
public function getLevel()
{
return $this->level;
}
}
class Promo implements HasLevel {
public $id;
public $name;
public $group;
public function __construct($id, $name, $group)
{
$this->id = $id;
$this->name = $name;
$this->group = $group;
}
public function getLevel()
{
return $this->group['level'];
}
}
class Tree {
/**
* @var Node
*/
public $node;
/**
* @param HasLevel[] $objects
* @return self
*/
public function collectFromObjects($objects)
{
$levels = [];
foreach ($objects as $object) {
$levels[$object->getLevel()][] = $object;
}
ksort($levels);
$this->node = $node = new Node();
foreach ($levels as $level => $items) {
$node->items = $items;
$node->level = $level;
if ($level === count($levels) - 1) {
break;
}
$node->childNode = new Node();
$node = $node->childNode;
}
return $this;
}
/**
* @return ?Node
*/
public function findByLevel($level)
{
if (!isset($this->node)) {
return null;
}
$curNode = $this->node;
while ($curNode->getLevel() !== $level) {
$curNode = $curNode->childNode;
if ($curNode === null) {
break;
}
}
return $curNode;
}
}
$objects = [
new Promo(3, 'Слава Украине', ['parent_id' => 2, 'level' => 2]),
new Promo(1, 'Слава России', ['parent_id' => null, 'level' => 0]),
new Promo(2, 'Слава Молдове', ['parent_id' => 1, 'level' => 1]),
new Promo(12, 'Слава Беларуси', ['parent_id' => 2, 'level' =>2])
];
$tree = (new Tree())->collectFromObjects($objects);
$secondLevel = $tree->findByLevel(2);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment