Php 如何建立一个;“子女父母”;数据库中的树/嵌套数组?
因为我们不知道一个人有多少“上层”人员,所以解决方案应该是一个自动功能,它可以构建一个完整的数组,而不仅仅是三维或四维数组。Php 如何建立一个;“子女父母”;数据库中的树/嵌套数组?,php,mysql,arrays,Php,Mysql,Arrays,因为我们不知道一个人有多少“上层”人员,所以解决方案应该是一个自动功能,它可以构建一个完整的数组,而不仅仅是三维或四维数组。 换句话说,该函数应该从一个高层深入到所有底层人员。假设数据是这样的 Array ( [1]=>Array ( [self]=>Clement [2]=>Array ( [self]=>Jean [4]=>Array (
换句话说,该函数应该从一个高层深入到所有底层人员。假设数据是这样的 Array ( [1]=>Array ( [self]=>Clement [2]=>Array ( [self]=>Jean [4]=>Array ( [self]=>Yuan ) [5]=>Array ( [self]=>Mei [7]=>Array ( [self]=>Yang ) ) ) [3]=>Array ( [self]=>Annie [6]=>Array ( [self]=>Blue ) ) ) [8]=>Array ( [self]=>Lorinda ) ) 此递归函数可能会工作:
$data = array(
array(1, 'Clement', 0),
array(2, 'Jean ', 1),
array(3, 'Annie ', 1),
array(4, 'Yuan ', 2),
array(5, 'Mei ', 2),
array(6, 'Blue ', 3),
array(7, 'Yang ', 5),
array(8, 'Lorinda', 0),
);
像这样使用它:
Clement
Jean
Yuan
Mei
Yang
Annie
Blue
Lorinda
function tree($data, $node) {
foreach($data as $e)
if($e[2] == $node[0])
$node['children'] []= tree($data, $e);
return $node;
}
考虑到您的输入:
$tree = tree($data, array(0));
print_r($tree);
使用,可以使用以下循环构建树:
$input = array(
array('sn' => 1, 'name' => 'Clement', 'upper' => 0),
array('sn' => 2, 'name' => 'Jean', 'upper' => 1),
array('sn' => 3, 'name' => 'Annie', 'upper' => 1),
array('sn' => 4, 'name' => 'Yuan', 'upper' => 2),
array('sn' => 5, 'name' => 'Mei', 'upper' => 2),
array('sn' => 6, 'name' => 'Blue', 'upper' => 3),
array('sn' => 7, 'name' => 'Yang', 'upper' => 5),
array('sn' => 8, 'name' => 'Lorinda', 'upper' => 0),
);
演示:这不是一个已解决的问题@true@true谢谢,但是我找不到同一个问题的答案,因为我的英语不正确。关于这个问题,你可以给我一些网站吗?@Jean Yang你可以通过循环和根据查询返回的结果生成新数组来实现这一点。@MobasherFasihy谢谢,我已经用这种方式尝试过了(循环),但是我没能让它完全工作…@Jean Yang你能写出查询返回的结果吗?这个函数的问题是,对于每个节点,整个数组都必须遍历,如果有更多的条目,这可能会非常昂贵。@Yoshi:我不确定这是否真的是个问题。即使有数千个节点,循环也会很快点亮。我有点困惑。说一个循环是否运行
n²
或n
次是不相关的,对我来说似乎有点极端…@Yoshi:为什么?如果整个过程需要,比如说,20秒,而这个特定函数需要0.002秒,那么它真的值得优化吗?我们对OP的项目一无所知,但我想一个DB查询会比这个函数占用更多的资源,不管它有多高效。@JeanYang这种区别确保了数据不必以任何方式排序。因此,子节点可以在其父节点之前出现,并且该函数仍然可以工作。谢谢!我真的不知道数据结构是如何工作的。。。我必须读更多关于节点和树的书。
$input = array(
array('sn' => 1, 'name' => 'Clement', 'upper' => 0),
array('sn' => 2, 'name' => 'Jean', 'upper' => 1),
array('sn' => 3, 'name' => 'Annie', 'upper' => 1),
array('sn' => 4, 'name' => 'Yuan', 'upper' => 2),
array('sn' => 5, 'name' => 'Mei', 'upper' => 2),
array('sn' => 6, 'name' => 'Blue', 'upper' => 3),
array('sn' => 7, 'name' => 'Yang', 'upper' => 5),
array('sn' => 8, 'name' => 'Lorinda', 'upper' => 0),
);
$map = array();
foreach ($input as $node) {
// init self
if (!array_key_exists($node['sn'], $map)) {
$map[$node['sn']] = array('self' => $node['name']);
}
else {
$map[$node['sn']]['self'] = $node['name'];
}
// init parent
if (!array_key_exists($node['upper'], $map)) {
$map[$node['upper']] = array();
}
// add to parent
$map[$node['upper']][$node['sn']] = & $map[$node['sn']];
}
print_r($map[0]);