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
次是不相关的,对我来说似乎有点极端…@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]);