Получить потомков родительских ворот в виде 1-мерного массива дочерних объектов (узлов и шлюзов) в укорененном направленном ациклическом дереве

мой укорененные направленные ациклические деревья будет состоять из логики ворота (и, или, xor …) и узлы.

узел & Ворота, каждый объект.

только ворота могут быть родителями.

каждый Ворота объект имеет дети собственность как общественности. дети может быть массив объектов или пустой массив.

ниже действительное дерево для моих дел. (g: гейт, n: узел)

g1
|---|---|---|---|
n1  n2  n3  g2  g3
|\
n4 n5

моя цель

получить потомков ворот в виде массива объектов. (Например: print_r($gate1->getDescendants()))

мой вопрос

Это мой первый опыт, я пытаюсь сделать небольшое приложение, связанное с моей работой. В моем коде ниже я понимаю, что проблемная часть: $this->descendants[] = $obj;

если я изменю эту строку на $descendants, то вывод по-прежнему некорректен из-за объема переменной выдачи.

Как я могу получить $gate1->getDescendants() работает правильно?

ожидается правильный выход

1-dim массив из 7 дочерних объектов для дерева ниже. (g: гейт, n: узел)

g1
|---|---|---|---|
n1  n2  n3  g2  g3
|\
n4 n5

неправильный вывод я получил

Array
(
[0] => Node Object
(
[id] => 1
)

[1] => Node Object
(
[id] => 2
)

[2] => Node Object
(
[id] => 3
)

[3] => Gate Object
(
[id] => 2
[type] => or
[desc] => My First OR Gate
[children] => Array
(
[0] => Node Object
(
[id] => 4
)

[1] => Node Object
(
[id] => 5
)

)

[descendants] => Array
(
[0] => Node Object
(
[id] => 4
)

[1] => Node Object
(
[id] => 5
)

)

)

[4] => Gate Object
(
[id] => 3
[type] => xor
[desc] => My First XOR Gate
[children] => Array
(
)

[descendants] =>
)

)

код: класс Node, класс Gate, try.php

class Node
{
public $id;

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

Ворота класса

class Gate
{
public $id;
public $type;
public $desc;
public $children = array();
public $descendants;

public function __construct($id, $type, $desc)
{
$this->id = $id;
$this->type = $type;
$this->desc = $desc;
}

public function addChild($child)
{
if($child instanceof Node OR $child instanceof Gate)
{
$this->children[] = $child;
}
else
{
throw new Exception('Child of Gate must be a Node or Gate object!');
}
}

public function getDescendants()
{
if(!empty($this->children))
{
$count_children = count($this->children);

for ($i = 0; $i < $count_children; $i++)
{
$obj = $this->children[$i];

$this->descendants[] = $obj;
// i tried also below
// $descendants[] = $obj;

if($obj instanceof Gate)
{
$obj->getDescendants();
}
}

return $this->descendants;
// i tried also below
//return $descendants;
}
else
{
return $this->children;
}
}
}

try.php

require_once('Node.php');
require_once('Gate.php');

$node1 = new Node(1);
$node2 = new Node(2);
$node3 = new Node(3);
$node4 = new Node(4);
$node5 = new Node(5);

$gate1 = new Gate(1,'and','My First AND Gate');
$gate2 = new Gate(2,'or','My First OR Gate');
$gate3 = new Gate(3,'xor','My First XOR Gate');

$gate1->addChild($node1);
$gate1->addChild($node2);
$gate1->addChild($node3);
$gate1->addChild($gate2);
$gate1->addChild($gate3);

$gate2->addChild($node4);
$gate2->addChild($node5);

function pa($var)
{
echo '<pre>';print_r($var);echo '</pre>';
}

/**
* get top gate's descandants
* (not only 1st level,
* but children @all levels)
*/
pa($gate1->getDescendants());

0

Решение

Одна небольшая корректировка:

if($obj instanceof Gate)
{
$this->descendants = array_merge($this->descendants, $obj->getDescendants());
}

Когда вы звоните $obj->getDescendants() Вы не используете возвращаемое значение.

Я предполагаю, что вы хотите, чтобы он был включен в переменную потомков, так как вы запрашиваете 7-элементный ответ массива.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector