【问题标题】:How to build a "child-parent" tree/nested array from database?如何从数据库构建“子父”树/嵌套数组?
【发布时间】:2014-08-13 07:18:27
【问题描述】:
表`人` +----+------------+--------+ |锡 |姓名 |鞋面 | +----+------------+--------+ | 1 |克莱门特 | 0 | | 2 |让 | 1 | | 3 |安妮 | 1 | | 4 |元 | 2 | | 5 |梅 | 2 | | 6 |蓝色 | 3 | | 7 |杨 | 5 | | 8 |洛琳达 | 0 | +----+------------+--------+

结构如下:

克莱门特 让 元 梅 杨 安妮 蓝色的 洛琳达

upper 栏目说明了他/她自己的上位人物。

问题是:如何从 MySQL 获取嵌套/多维数组? 我以为我可以使用循环来获取,但我未能自动获取所有较低的值。 数组可能是这样的:

大批 ( [1]=>数组 ( [自己]=>克莱门特 [2]=>数组 ( [自己]=>让 [4]=>数组 ( [self]=>元 ) [5]=>数组 ( [自己]=>梅 [7]=>数组 ( [自己]=>杨 ) ) ) [3]=>数组 ( [自己]=>安妮 [6]=>数组 ( [自己]=>蓝色 ) ) ) [8]=>数组 ( [自己]=>罗琳达 ) )

由于我们不知道一个人有多少“上位”人员,因此解决方案应该是构建完整数组的自动化函数,而不仅仅是三维或四维。 也就是说,功能应该从上层深入到所有下层。

【问题讨论】:

  • 这不是一个已解决的问题@true
  • @true 谢谢,但我找不到同一个问题的答案,因为我的英语不正确和准确。你能给我一些关于这个问题的网站吗?
  • @Jean Yang 您可以通过循环并从返回的查询结果中创建新数组来做到这一点。
  • @MobasherFasihy 谢谢,我已经尝试过这种方式(循环),但我未能使其完全工作......
  • @Jean Yang 你能写出查询的返回结果吗?

标签: php mysql arrays


【解决方案1】:

鉴于您的输入为:

$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),
);

使用references,您可以使用以下循环构建树:

$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]);

演示http://3v4l.org/vuVPu

【讨论】:

  • @JeanYang 区别确保数据不必以任何方式排序。所以一个子节点可以在它的父节点之前出现,并且该函数仍然可以工作。
  • 谢谢!我真的不知道数据结构是如何工作的......我必须阅读更多关于节点和树的书籍。
【解决方案2】:

假设数据是这样的

$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),
);

这个递归函数可能会起作用:

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);

【讨论】:

  • 这个函数的问题是每个节点都必须遍历整个数组,如果有更多条目,这可能会变得非常昂贵。
  • @Yoshi:我不确定这是否真的有问题。即使有数千个节点,循环也会快速点亮。
  • 我有点困惑。说循环是否运行 n 次无关紧要,对我来说似乎有点极端......
  • @Yoshi:为什么?如果整个过程需要 20 秒,而这个特定功能需要 0.002 秒,那么它真的值得优化吗?我们对 OP 的项目一无所知,但我猜一个单独的 DB 查询会比这个函数占用更多的资源,不管它有多高效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多