在有根有向无环树中获取父门的后代作为子对象(节点和门)的一维数组
Get descendants of a parent gate as a 1-dim array of child objects (nodes & gates) in a rooted directed acyclic tree
我的有根有向无环树将由逻辑门(与、或、异或...)和节点.
a node & a gate,每一个都是object.
只有一个门可以是父门。
每个 gate 对象都有 children 属性 作为 public. children 可以是 对象数组 或 空数组 .
下面是我的案例的有效树。 (g:门, n:node)
g1
|---|---|---|---|
n1 n2 n3 g2 g3
|\
n4 n5
我的目标
以对象数组的形式获取门的后代。 (例如:print_r($gate1->getDescendants())
)
我的问题
这是我的第一次oop体验,我尝试做一个与我的工作相关的小应用程序。在我下面的代码中,我知道有问题的部分是:$this->descendants[] = $obj;
如果我将此行更改为 $descendants
,则由于变量范围问题,输出仍然不正确。
如何让 $gate1->getDescendants()
正常工作?
预期输出正确
下方树的 7 个子对象的一维数组。 (g:门, n:node)
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] =>
)
)
代码:class节点,class门,try.php
class Node
{
public $id;
public function __construct($id)
{
$this->id = $id;
}
}
class门
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());
一个小调整:
if($obj instanceof Gate)
{
$this->descendants = array_merge($this->descendants, $obj->getDescendants());
}
当您调用 $obj->getDescendants()
时,您并未使用返回值。
我假设您希望它合并到 descendants 变量中,因为您正在请求 7 元素数组响应。
我的有根有向无环树将由逻辑门(与、或、异或...)和节点.
a node & a gate,每一个都是object.
只有一个门可以是父门。
每个 gate 对象都有 children 属性 作为 public. children 可以是 对象数组 或 空数组 .
下面是我的案例的有效树。 (g:门, n:node)
g1
|---|---|---|---|
n1 n2 n3 g2 g3
|\
n4 n5
我的目标
以对象数组的形式获取门的后代。 (例如:print_r($gate1->getDescendants())
)
我的问题
这是我的第一次oop体验,我尝试做一个与我的工作相关的小应用程序。在我下面的代码中,我知道有问题的部分是:$this->descendants[] = $obj;
如果我将此行更改为 $descendants
,则由于变量范围问题,输出仍然不正确。
如何让 $gate1->getDescendants()
正常工作?
预期输出正确
下方树的 7 个子对象的一维数组。 (g:门, n:node)
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] =>
)
)
代码:class节点,class门,try.php
class Node
{
public $id;
public function __construct($id)
{
$this->id = $id;
}
}
class门
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());
一个小调整:
if($obj instanceof Gate)
{
$this->descendants = array_merge($this->descendants, $obj->getDescendants());
}
当您调用 $obj->getDescendants()
时,您并未使用返回值。
我假设您希望它合并到 descendants 变量中,因为您正在请求 7 元素数组响应。