[英]Create and manage nested array
我已经尝试了一段时间,以弄清楚如何使它正常工作,并且经过大量Google的尝试,却找不到类似于我的问题(也许我在找错东西?),我决定问:
我得到的传入数据实质上显示了IRC服务器UUID的二进制树,即服务器的UUID和其父服务器的UUID。 我想做的是创建一个数组,它是一棵这样的树,传入的数据如下:
Parent => Child
none => 01D
01D => 01B
01B => 01F
01B => 8OS
01B => 01k
01K => 01M
我希望它位于诸如以下的数组中:
$tree = array('01D' => array(
'01B' => array(
'01F' => array(),
'8OS' => array(),
'01k' => array('01M' => array()));
我不能一次获得所有数据,并且不在数据库中,因此从本质上讲,我需要能够随意添加分支。
我要这样做的主要原因是,如果其中一台服务器消失了,说“ 01F”,我知道它是哪个子代,并且可以通过那些子代。 那么,在这方面,我将如何遍历孩子们? 本质上是在IRC上下文中,处理netsplis。
我什至不确定这是否是最好的方法,也许不是。
传入的数据采用以下格式是没有意义的:
Parent => Child
none => 01D
01D => 01B
01B => 01F
01B => 8OS
01B => 01k
01K => 01M
...因为键是非唯一的(例如01B
)。 您应该翻转数组,使其看起来像这样:
$uuids = array(
'01D' => NULL,
'01B' => '01D',
'01F' => '01B',
'8OS' => '01B',
'01K' => '01B',
'01M' => '01K'
);
查找故障节点的子级是一个简单的循环和in_array()
调用:
$failedNodes = array('01B'); // original failed node
foreach ($uuids as $child => $parent) {
if (in_array($parent, $failedNodes)) {
$failedNodes[] = $child;
}
}
var_dump($failedNodes);
输出:
array(4) {
[0]=>
string(3) "01B"
[1]=>
string(3) "01F"
[2]=>
string(3) "8OS"
[3]=>
string(3) "01k"
}
好吧,我通常在这种情况下使用引用或对象。 我在这里向您展示的是如何使用引用,一个模式很像。
//Initialize your server array
$servers = array();
//Then, each time you get a new server to add, add it to the server list if it doesn't exist
if(!isset($servers[$myname])){
$servers[$myname] = array(
'name' => 'data1',
'prop1' => 'data2',
'prop2' => 'data3',
'prop3' => 'data4',
'prop4' => 'data5',
'childrens' => array(),
);
}
//Then add your server to the children of the appropriate server
if(isset($servers[$myparent])){
$servers[$myparent]['childrens'][] = &$servers[$myname];
}
这将创建所有可能服务器的列表,并将每个条目链接到另一个条目。 这样,如果删除服务器,则不会丢失该子级内部的数据,而只会丢失引用。
如果您要在哪里教孩子,您将获得引用的数据,var_dump,print_r ??? 它们都可以正常工作... unset($ servers ['thatoneserver'])您仍然保留所有服务器数据,但是丢失了该服务器及其子节点的链接。
等等...
我不会重建那棵树。 只需保持亲子关系即可。 从您的首要原因出发,您还是只关心孩子。
$nodes = array(
'01D' => array('01B'),
'01B' => array('01F', '8OS', '01k'),
// ...
);
然后,当节点发生故障时,您可以轻松找到子$nodes[$failed]
( $nodes[$failed]
)并从那里遍历。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.