递归函数从数据库结果生成多维数组

我正在寻找一个函数,该函数需要一个页面/类别的数组(来自平面数据库结果),并根据父ID生成一个嵌套的页面/类别的数组。我想递归地执行此操作,以便可以进行任何级别的嵌套。

例如:我在一个查询中获取所有页面,这就是数据库表的样子

+-------+---------------+---------------------------+

| id | parent_id | title |

+-------+---------------+---------------------------+

| 1 | 0 | Parent Page |

| 2 | 1 | Sub Page |

| 3 | 2 | Sub Sub Page |

| 4 | 0 | Another Parent Page |

+-------+---------------+---------------------------+

这是我要最终在视图文件中处理的数组:

Array

(

[0] => Array

(

[id] => 1

[parent_id] => 0

[title] => Parent Page

[children] => Array

(

[0] => Array

(

[id] => 2

[parent_id] => 1

[title] => Sub Page

[children] => Array

(

[0] => Array

(

[id] => 3

[parent_id] => 1

[title] => Sub Sub Page

)

)

)

)

)

[1] => Array

(

[id] => 4

[parent_id] => 0

[title] => Another Parent Page

)

)

我已经看过并尝试过几乎遇到的所有解决方案(Stack Overflow上有很多解决方案,但是没有运气得到足够通用的东西同时适用于页面和类别)。

这是我得到的最接近的东西,但是它不起作用,因为我正在将孩子分配给第一级父母。

function page_walk($array, $parent_id = FALSE)

{

$organized_pages = array();

$children = array();

foreach($array as $index => $page)

{

if ( $page['parent_id'] == 0) // No, just spit it out and you're done

{

$organized_pages[$index] = $page;

}

else // If it does,

{

$organized_pages[$parent_id]['children'][$page['id']] = $this->page_walk($page, $parent_id);

}

}

return $organized_pages;

}

function page_list($array)

{

$fakepages = array();

$fakepages[0] = array('id' => 1, 'parent_id' => 0, 'title' => 'Parent Page');

$fakepages[1] = array('id' => 2, 'parent_id' => 1, 'title' => 'Sub Page');

$fakepages[2] = array('id' => 3, 'parent_id' => 2, 'title' => 'Sub Sub Page');

$fakepages[3] = array('id' => 4, 'parent_id' => 3, 'title' => 'Another Parent Page');

$pages = $this->page_walk($fakepages, 0);

print_r($pages);

}

回答:

一些非常简单的通用树构建:

function buildTree(array $elements, $parentId = 0) {

$branch = array();

foreach ($elements as $element) {

if ($element['parent_id'] == $parentId) {

$children = buildTree($elements, $element['id']);

if ($children) {

$element['children'] = $children;

}

$branch[] = $element;

}

}

return $branch;

}

$tree = buildTree($rows);

该算法非常简单:

  1. 取所有元素的数组和当前父对象的ID(最初是0/ nothing / null/ whatever)。
  2. 遍历所有元素。
  3. 如果parent_id元素的匹配您在1中获得的当前父ID,则该元素是父元素的子元素。将其放入您当前的孩子列表中(此处:)$branch
  4. 用您刚刚在3.中标识的元素的ID递归调用该函数,即找到该元素的所有子元素,并将它们添加为children元素。
  5. 返回找到的孩子列表。

换句话说,执行此函数将返回元素列表,这些元素是给定父ID的子元素。用调用它buildTree($myArray,

1),它将返回具有父ID为1的元素的列表。最初,以父ID为0调用此函数,因此返回没有父ID的元素,它们是根节点。该函数以递归方式调用自身以找到孩子的孩子。

以上是 递归函数从数据库结果生成多维数组 的全部内容, 来源链接: utcz.com/qa/413098.html

回到顶部