栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用带有mysql查询结果的php获取父级下的所有子级,孙级等节点

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用带有mysql查询结果的php获取父级下的所有子级,孙级等节点

编辑:

之前,我曾发布过一种解决方案,可以从您提供的输出中构建多维数组,以及一种

id
从特定数组中获取特定子元素的方法。现在,我已经弄清楚了如何直接从输出中检索子元素(而不必首先通过一个
buildtree()
函数:

function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array()){    foreach($src_arr as $row)    {        if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid)        { $rowdata = array(); foreach($row as $k => $v)     $rowdata[$k] = $v; $cats[] = $rowdata; if($row['parent_id'] == $currentid)     $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true));        }    }    return $cats;}

要使用上面的函数,只需将输出数组传递

$data
给第一个参数,然后
id
您要从第二个参数中检索子元素:

例如:

$list = fetch_recursive($data, 3);

哪个应该为您提供正确的数组结构

id
3
(如该答案最后一个代码框中的示例所示)。


原始答案:

到目前为止,我从来没有写过一个递归函数来从此设计中构建嵌套树。我敢肯定还有很多其他人编写了类似的函数,但是这个绝对可以为您工作:

function buildtree($src_arr, $parent_id = 0, $tree = array()){    foreach($src_arr as $idx => $row)    {        if($row['parent_id'] == $parent_id)        { foreach($row as $k => $v)     $tree[$row['id']][$k] = $v; unset($src_arr[$idx]); $tree[$row['id']]['children'] = buildtree($src_arr, $row['id']);        }    }    ksort($tree);    return $tree;}

此函数将在邻接表之外递归地构建树,并保持ID的升序排列。这也使

id
每个父/子的成为每个信息数组的键。

这段代码:

$r = mysql_query("SELECt * FROM test ");$data = array();while($row = mysql_fetch_assoc($r)) {    $data[] = $row;}echo '<pre>';print_r(buildtree($data));echo '</pre>';

将输出如下内容:

Array (    [1] => Array     (        [id] => 1        [name] => Electronics         [parent_id] => 0         [children] => Array        ( [2] => Array  (      [id] => 2     [name] => Televisions      [parent_id] => 1      [children] => Array     (         [4] => Array          (  [id] => 4  [name] => Tube   [parent_id] => 2  [children] => Array()         )         [5] => Array          (  [id] => 5  [name] => LCD   [parent_id] => 2  [children] => Array()         )         [6] => Array         (  [id] => 6  [name] => Plasma   [parent_id] => 2  [children] => Array()         )     ) ) [3] => Array  (     [id] => 3     [name] => Portable Electronics      [parent_id] => 1     [children] => Array     (         [7] => Array         (  [id] => 7  [name] => Mp3 Players   [parent_id] => 3   [children] => Array  (      [10] => Array      (          [id] => 10          [name] => Flash[parent_id] => 7          [children] => Array()      )   )         )         [8] => Array          (  [id] => 8  [name] => CD Players   [parent_id] => 3  [children] => Array()         )         [9] => Array          (  [id] => 9  [name] => 2 Way Radios   [parent_id] => 3  [children] => Array()         )     ) )        )    ))

要将特定对象的所有子节点放入

id
一维数组中,可以使用以下函数:

function fetch_recursive($tree, $parent_id, $parentfound = false, $list = array()){    foreach($tree as $k => $v)    {        if($parentfound || $k == $parent_id)        { $rowdata = array(); foreach($v as $field => $value)     if($field != 'children')         $rowdata[$field] = $value; $list[] = $rowdata; if($v['children'])     $list = array_merge($list, fetch_recursive($v['children'], $parent_id, true));        }        elseif($v['children']) $list = array_merge($list, fetch_recursive($v['children'], $parent_id));    }    return $list;}

基于上面的

buildtree()
函数,假设我们要获取所有
id
3 个子节点:

echo '<pre>';print_r(fetch_recursive(buildtree($a), 3));echo '</pre>';

这将输出:

Array(    [0] => Array        ( [id] => 3 [name] => Portable Electronics [parent_id] => 1        )    [1] => Array        ( [id] => 7 [name] => Mp3 Players [parent_id] => 3        )    [2] => Array        ( [id] => 10 [name] => Flash [parent_id] => 7        )    [3] => Array        ( [id] => 8 [name] => CD Players [parent_id] => 3        )    [4] => Array        ( [id] => 9 [name] => 2 Way Radios [parent_id] => 3        ))


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415276.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号