如何使用数据库行数据的递归生成面包屑?

时间:2013-04-15 07:01:51

标签: php arrays recursion breadcrumbs

我必须制作一个包含数据库的痕迹菜单。

所以做了这个功能

function file_list($path) {
    $result = array();
    $q = "SELECT staticTitle,staticId,parentId FROM tbl_static_pages WHERE staticId = $path";
    $run = mysql_query($q);
    while($row = mysql_fetch_array($run)) {
        if($row['parentId'] > 1) {
            echo $row['staticTitle'];
            $result = file_list($row['parentId']);
            return $result; // INSERTED
        }else { 
            return $result; 
        }  
    }

我有这样的数据库结构:

 id | parentId | title
 3  |  1      | keyword
 28 |  3      | xxx
 31 | 28      | business 

我希望像business -> xxx -> keyword

一样输出

我希望在$row['parentId'] = 1之前运行此函数。
当我回显标题时,我得到了正确的结果。
当我尝试将其存储在数组中时,我总是得到单值

如何在递归数组中返回数组?

3 个答案:

答案 0 :(得分:0)

试试这个:

function file_list($path)
{
    $result = array();
    $q = "SELECT staticTitle,staticId,parentId FROM tbl_static_pages WHERE staticId = $path";
    $run = mysql_query($q);

    $results = array();
    while ($row = mysql_fetch_array($run))
    {
        if ($row['parentId'] > 1)
        {
            echo $row['staticTitle'];
            $results = array_merge($results, file_list($row['parentId']));
        }
        else
        { 
            $results[] = $result; 
        }
    }  
    return $results;
}

您的问题中很少有不明确的事情:

  • 面包屑通常不是递归的,所以我想你不想实际返回一个递归数组(每个元素都是数组的数组)。如果需要,请关注@midhunjose的评论
  • 您希望查询返回多条记录吗?
  • 交换array_merge参数的顺序,如果您希望在结果数组中显示子节点之前的父节点。

答案 1 :(得分:0)

我真的不喜欢数据库上递归调用的想法。如果这是"面包屑"数据库表,可能有多大? ......我的意思是大小可能不是一个问题。

我想建议您拉出整个表(3列,所有行)并将结果集分配给php变量。这意味着你只需要去一次数据库 - 这是一件好事。

代码:(Demo

function breadcrumber($array,$id){
    static $result=[];  // declare the storage variable without losing elements during recursion
    if(isset($array[$id])){  // if target exists
        $result[]=$array[$id]['title'];  // store title text
        $parent=$array[$id]['parentId'];  // assign new target
        unset($array[$id]);  // remove possibility of an infinite loop
        breadcrumber($array,$parent);  // recurse
    }
    return $result;
}

$resultset=[
    ['id'=>3,'parentId'=>1,'title'=>'keyword'],
    ['id'=>28,'parentId'=>3,'title'=>'xxx'],
    ['id'=>31,'parentId'=>28,'title'=>'business']
];

echo implode(' -> ',breadcrumber(array_column($resultset,NULL,'id'),31));
//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-assign associative keys for easy lookup

输出:

business -> xxx -> keyword

......这里是another demo using your second set of data

答案 2 :(得分:-1)

试试这个:

$result[] = file_list($row['parentId']);

而不是

$result = file_list($row['parentId']);